$slice$slice修饰符限制$push操作期间大量元素的数量。要从读取操作中项目或返回指定数量的大量元素,请参阅$slice投影操作符。要使用
$slice修饰符,它必须与$each修饰符同时出现。您可以将一个空数组[]传递给$each修饰符,从而只让$slice修饰符起作用。{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $slice: <num> } } } <num>可以是:值说明Zero
要将数组
<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 字段,请为 $slice 修饰符指定要切片的元素数(例如 -3),并且为 $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修改器,按score字段降序对修改后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 } ] }
修饰符的顺序与修饰符的处理顺序无关。如需了解详细信息,请参阅“修饰符”。