$sliceThe$slicemodifier limits the number of array elements during a$pushoperation.$slice修饰符限制了$push操作期间数组元素的数量。To project, or return, a specified number of array elements from a read operation, see the要从读取操作中投影或返回指定数量的数组元素,请参阅$sliceprojection operator instead.$slice投影运算符。To use the要使用$slicemodifier, it must appear with the$eachmodifier.$slice修饰符,它必须与$each修饰符一起出现。You can pass an empty array您可以将一个空数组[]to the$eachmodifier such that only the$slicemodifier has an effect.[]传递给$each修饰符,这样只有$slice修饰符有效果。{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$slice: <num>
}
}
}The
<num>can be:Value Description描述Zero To update the array将数组<field>to an empty array.<field>更新为空数组。Negative To update the array将数组<field>to contain only the last<num>elements.<field>更新为仅包含最后一个<num>元素。Positive To update the array要更新数组,<field>contain only the first<num>elements.<field>只包含第一个<num>元素。
Behavior行为
Starting in MongoDB 5.0, update operators process document fields with string-based names in lexicographic order. Fields with numeric names are processed in numeric order. See Update Operators Behavior for details.从MongoDB 5.0开始,更新运算符按字典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。有关详细信息,请参阅更新运算符行为。
The order in which the modifiers appear is immaterial. 修饰语出现的顺序无关紧要。Previous versions required the 以前的版本要求$each modifier to appear as the first modifier if used in conjunction with $slice. For a list of modifiers available for $push, see Modifiers.$each修饰符在与$slice结合使用时显示为第一个修饰符。有关可用于$push的修饰符列表,请参阅修饰符。
Trying to use the 尝试使用$slice modifier without the $each modifier results in an error.$slice修饰符而不使用$each修饰符会导致错误。
Examples示例
Slice from the End of the Array从数组末尾开始分片
A collection students contains the following document:students集合包含以下文件:
db.students.insertOne([
{ _id : 1, "scores" : [ 40, 50, 60 ] }
] )
The following operation adds new elements to the 以下操作将新元素添加到scores array, and then uses the $slice modifier to trim the array to the last five elements:scores数组中,然后使用$slice修饰符将数组修剪为最后五个元素:
db.students.updateOne(
{ _id: 1 },
{
$push: {
scores: {
$each: [ 80, 78, 86 ],
$slice: -5
}
}
}
)
The result of the operation is slice the elements of the updated 操作的结果是将更新后的scores array to the last five elements:scores数组的元素分片为最后五个元素:
{ "_id" : 1, "scores" : [ 50, 60, 80, 78, 86 ] }Slice from the Front of the Array从数组前面分片
A collection students contains the following document:students集合包含以下文件:
db.students.insertOne( [
{ _id : 2, "scores" : [ 89, 90 ] }
] )
The following operation adds new elements to the 以下操作将新元素添加到scores array, and then uses the $slice modifier to trim the array to the first three elements.scores数组中,然后使用$slice修饰符将数组修剪为前三个元素。
db.students.updateOne(
{ _id: 2 },
{
$push: {
scores: {
$each: [ 100, 20 ],
$slice: 3
}
}
}
)
The result of the operation is to slice the elements of the updated 该操作的结果是将更新后的scores array to the first three elements:scores数组的元素分片为前三个元素:
{ "_id" : 2, "scores" : [ 89, 90, 100 ] }Update Array Using Slice Only仅使用分片更新数组
A collection students contains the following document:students集合包含以下文件:
db.students.insertOne( [
{ _id : 3, "scores" : [ 89, 70, 100, 20 ] }
] )
To update the 要仅使用scores field with just the effects of the $slice modifier, specify the number of elements to slice (e.g. -3) for the $slice modifier and an empty array [] for the $each modifier, as in the following:$slice修饰符的效果更新scores字段,请为$slice修改器指定要分片的元素数量(例如-3),为$each修改器指定一个空数组[],如下所示:
db.students.updateOne(
{ _id: 3 },
{
$push: {
scores: {
$each: [ ],
$slice: -3
}
}
}
)
The result of the operation is to slice the elements of the 该操作的结果是将scores array to the last three elements:scores数组的元素分片为最后三个元素:
{ "_id" : 3, "scores" : [ 70, 100, 20 ] }Use $slice with Other $push Modifiers将$slice与其他$push修饰符一起使用
$slice with Other $push ModifiersAdd the following document to the 将以下文档添加到students collection:students集合中:
db.students.insertOne(
{
"_id" : 5,
"quizzes" : [
{ "wk": 1, "score" : 10 },
{ "wk": 2, "score" : 8 },
{ "wk": 3, "score" : 5 },
{ "wk": 4, "score" : 6 }
]
}
)
The following 以下$push operation uses:$push操作使用:
the$eachmodifier to add multiple documents to thequizzesarray,$each修饰符用于将多个文档添加到测验数组中,the$sortmodifier to sort all the elements of the modifiedquizzesarray by thescorefield in descending order, and$sort修饰符,用于按score字段降序对修改后的quizzes数组的所有元素进行排序,以及the$slicemodifier to keep only the first three sorted elements of thequizzesarray.$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
}
}
}
)
After the operation only the three highest scoring quizzes are in the array:操作后,数组中只有三个得分最高的测验:
{
"_id" : 5,
"quizzes" : [
{ "wk" : 1, "score" : 10 },
{ "wk" : 2, "score" : 8 },
{ "wk" : 5, "score" : 8 }
]
}
The order of the modifiers is immaterial to the order in which the modifiers are processed. See Modifiers for details.修饰符的顺序与修饰符的处理顺序无关。有关详细信息,请参阅修饰符。