$slice

On this page本页内容

$slice

The $slice modifier limits the number of array elements during a $push operation. $slice修饰符限制$push操作期间的数组元素数。To project, or return, a specified number of array elements from a read operation, see the $slice projection operator instead.要从读取操作中投影或返回指定数量的数组元素,请改为使用$slice投影运算符。

To use the $slice modifier, it must appear with the $each modifier. 要使用$slice修饰符,它必须$each修饰符一起出现。You can pass an empty array [] to the $each modifier such that only the $slice modifier has an effect.可以将空数组[]传递给$each修饰符,以便只有$slice修饰符具有效果。

{
  $push: {
     <field>: {
       $each: [ <value1>, <value2>, ... ],
       $slice: <num>
     }
  }
}

The <num> can be:<num>可以是:

ValueDescription描述
ZeroTo update the array <field> to an empty array.将数组<field>更新为空数组。
NegativeTo update the array <field> to contain only the last <num> elements.更新数组<field>以仅包含最后<num>元素。
PositiveTo 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. 从MongoDB 5.0开始,更新运算符以词典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。See Update Operators Behavior for details.有关详细信息,请参阅更新运算符行为

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. 以前的版本要求$each修饰符在与$slice一起使用时显示为第一个修饰符。For a list of modifiers available for $push, see Modifiers.有关$push可用的修饰符列表,请参阅修饰符

Trying to use the $slice modifier without the $each modifier results in an error.尝试在不使用$each修饰符的情况下使用$slice修饰符将导致错误。

Examples示例

Slice from the End of the Array从数组末尾开始分片

A collection students contains the following document:students集合包含以下文档:

{ "_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集合包含以下文档:

{ "_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集合包含以下文档:

{ "_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修饰符的效果更新分数字段,请为$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修饰符一起使用

Add 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 $each modifier to add multiple documents to the quizzes array,$each修饰符将多个文档添加到quizzes数组,
  • the $sort modifier to sort all the elements of the modified quizzes array by the score field in descending order, and$sort修饰符按quizzes字段按降序对修改后的quizzes数组的所有元素进行排序,并且
  • the $slice modifier to keep only the first three sorted elements of the quizzes array.$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.有关详细信息,请参阅修饰符

←  $position$sort →