$slice
$slice
的
$slice
修饰符限制了在$push
操作期间数组元素的数量。要投影或返回读操作中指定的数组元素数量,请参阅$slice
投影操作符。要使用
$slice
修饰符,它必须与$each
修饰符一起出现。您可以将空数组[]
传递给$each
修饰符,这样只有$slice
修饰符才有效。{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $slice: <num> } } } <num>
可以是值描述零将数组<field>
更新为空数组。负数将数组<field>
更新为仅包含最后<num>
个元素。正数将数组<field>
更新为仅包含前<num>
个元素。
行为
从MongoDB 5.0版本开始,更新操作符按字典顺序处理具有基于字符串的名称的字段。具有数字名称的字段按数字顺序处理。有关详细信息,请参阅更新操作符行为。
修饰符出现的顺序无关紧要。旧版本需要当与$slice
一起使用时,将$each
修饰符作为第一个修饰符。有关$push
可用的修饰符列表,请参阅修饰符。
示例
从数组的末尾切片
集合students
包含以下文档
{ "_id" : 1, "scores" : [ 40, 50, 60 ] }
以下操作将新元素添加到scores
数组中,然后使用$slice
修饰符来修剪数组到最后五个元素
db.students.updateOne( { _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.updateOne( { _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
字段,指定要裁剪的元素数量(例如 -3
)作为 $slice
修饰符,并指定空数组 []
作为 $each
修饰符,如下所示
db.students.updateOne( { _id: 3 }, { $push: { scores: { $each: [ ], $slice: -3 } } } )
操作的结果是将 scores
数组的元素裁剪到最后三个。
{ "_id" : 3, "scores" : [ 70, 100, 20 ] }
使用 $slice
与其他 $push
修饰符
将以下文档添加到 students
集合
db.students.insertOne( { "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] } )
以下 $push
操作使用
$each
修饰符将多个文档添加到quizzes
数组中,$sort
修饰符按降序对所有修改后的quizzes
数组的元素进行排序,以及$slice
修饰符仅保留quizzes
数组中的前三个排序元素。
db.students.updateOne( { _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 } ] }
修饰符的顺序不影响修饰符的处理顺序。有关详细信息,请参阅修饰符。