On this page
$slice
在本页面
要使用$slice修饰符,它必须与$each修饰符一起出现。您可以将一个空数组[]
传递给$each修饰符,以使只有$slice修饰符起作用。
{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$slice: <num>
}
}
}
<num>
可以是:
Value | Description |
---|---|
Zero | 将数组<field> 更新为空数组。 |
Negative | 将数组<field> 更新为仅包含最后<num> 个元素。 |
Positive | 要更新数组<field> ,只包含前<num> 个元素。 |
2.6 版中的新功能。
Behavior
修饰符出现的 Sequences 无关紧要。如果与$slice结合使用,则以前的版本要求$each修饰符显示为第一个修饰符。有关$push可用的修饰符的列表,请参见Modifiers。
尝试使用没有$each修饰符的$slice修饰符会导致错误。
Examples
从数组末尾切片
集合students
包含以下文档:
{ "_id" : 1, "scores" : [ 40, 50, 60 ] }
以下操作将新元素添加到scores
数组,然后使用$slice修饰符将数组修剪为最后五个元素:
db.students.update(
{ _id: 1 },
{
$push: {
scores: {
$each: [ 80, 78, 86 ],
$slice: -5
}
}
}
)
操作的结果是将更新后的scores
数组的元素切片为最后五个元素:
{ "_id" : 1, "scores" : [ 50, 60, 80, 78, 86 ] }
从阵列的前面切片
集合students
包含以下文档:
{ "_id" : 2, "scores" : [ 89, 90 ] }
以下操作将新元素添加到scores
数组,然后使用$slice修饰符将数组修剪为前三个元素。
db.students.update(
{ _id: 2 },
{
$push: {
scores: {
$each: [ 100, 20 ],
$slice: 3
}
}
}
)
该操作的结果是将更新后的scores
数组的元素切片为前三个元素:
{ "_id" : 2, "scores" : [ 89, 90, 100 ] }
仅使用切片更新阵列
集合students
包含以下文档:
{ "_id" : 3, "scores" : [ 89, 70, 100, 20 ] }
要仅使用$slice修饰符的效果更新scores
字段,请为$slice修饰符指定要切片的元素数量(例如-3
),为$each修饰符指定一个空数组[]
,如下所示:
db.students.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ ],
$slice: -3
}
}
}
)
该操作的结果是将scores
数组的元素切片为最后三个元素:
{ "_id" : 3, "scores" : [ 70, 100, 20 ] }
将$ slice 与其他$ push 修饰符一起使用
集合students
包含以下文档:
{
"_id" : 5,
"quizzes" : [
{ "wk": 1, "score" : 10 },
{ "wk": 2, "score" : 8 },
{ "wk": 3, "score" : 5 },
{ "wk": 4, "score" : 6 }
]
}
以下$push操作使用:
$each修饰符可将多个文档添加到
quizzes
数组,$sort修饰符,以按
score
字段降序对修改后的quizzes
数组的所有元素进行排序,以及$slice修饰符,仅保留
quizzes
数组的前三个排序元素。
db.students.update(
{ _id: 5 },
{
$push: {
quizzes: {
$each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
$sort: { score: -1 },
$slice: 3
}
}
}
)
该操作的结果是仅保留三个最高得分测验:
{
"_id" : 5,
"quizzes" : [
{ "wk" : 1, "score" : 10 },
{ "wk" : 2, "score" : 8 },
{ "wk" : 5, "score" : 8 }
]
}
修饰符的 Sequences 与修饰符的处理 Sequences 无关紧要。有关详情,请参见Modifiers。