$[]

On this page本页内容

Definition定义

$[]

New in version 3.6.版本3.6中的新功能。

The all positional operator $[] indicates that the update operator should modify all elements in the specified array field.所有位置运算符$[]表示更新运算符应修改指定数组字段中的所有元素。

The $[] operator has the following form:$[]运算符的形式如下:

{ <update operator>: { "<array>.$[]" : value } }

Use in update operations, e.g. db.collection.update() and db.collection.findAndModify(), to modify all array elements for the document or documents that match the query condition. 用于更新操作,例如db.collection.update()db.collection.findAndModify()方法,用于修改文档或与查询条件匹配的文档的所有数组元素。For example:例如:

db.collection.updateMany(
   { <query conditions> },
   { <update operator>: { "<array>.$[]" : value } }
)

For an example, see Update All Elements in an Array.有关示例,请参阅更新数组中的所有元素

Behavior行为

upsert

If an upsert operation results in an insert, the query must include an exact equality match on the array field in order to use the $[] positional operator in the update statement.如果upsert操作导致插入,则query必须在数组字段上包含完全相等的匹配,以便在更新语句中使用$[]位置运算符。

For example, the following upsert operation, which uses $[] in the update document, specifies an exact equality match condition on the array field:例如,以下upsert操作在更新文档中使用$[]指定数组字段上的精确相等匹配条件:

db.collection.update(
   { myArray: [ 5, 8 ] },
   { $set: { "myArray.$[]": 10 } },
   { upsert: true }
)

If no such document exists, the operation would result in an insertion of the following document:如果不存在此类文档,操作将导致插入以下文档:

{ "_id" : ObjectId(...), "myArray" : [ 10, 10 ] }

If the upsert operation did not include an exact equality match and no matching documents were found to update, the upsert operation would error.如果upsert操作未包含完全相等的匹配,并且未找到要更新的匹配文档,upsert操作将出错。

For example, the following operations would error if no matching documents were found to update:例如,如果没有找到要更新的匹配文档,则以下操作将出错:

db.collection.update(
   { myArray: 5 },
   { $set: { "myArray.$[]": 10 } },
   { upsert: true }
)

db.collection.update(
   { },
   { $set: { "myArray.$[]": 10 } },
   { upsert: true }
)

Nested Arrays嵌套数组

The $[] operator can be used for queries which traverse more than one array and nested arrays.$[]运算符可用于遍历多个数组和嵌套数组的查询。

For an example, see Update Nested Arrays in Conjunction with $[<identifier>].有关示例,请参阅结合$[<identifier>]更新嵌套数组

Examples示例

Update All Elements in an Array更新数组中的所有元素

Consider a collection students with the following documents:考虑集合students带有下列文档:

{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

To increment all elements in the grades array by 10 for all documents in the collection, use the all positional $[] operator:要对集合中的所有文档将grades数组中的所有元素增加10,请使用所有位置运算符$[]

db.students.update(
   { },
   { $inc: { "grades.$[]": 10 } },
   { multi: true }
)

The all positional $[] operator acts as a placeholder for all elements in the array field.所有位置运算符$[]充当数组字段中所有元素的占位符。

After the operation, the students collection contains the following documents:操作完成后,students集合包含以下文档:

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }

Update All Documents in an Array更新数组中的所有文档

The $[] positional operator facilitates updates to arrays that contain embedded documents. $[]位置运算符有助于更新包含嵌入文档的数组。To access the fields in the embedded documents, use the dot notation on the $[] operator.要访问嵌入文档中的字段,请在$[]运算符上使用点符号

db.collection.update(
   { <query selector> },
   { <update operator>: { "array.$[].field" : value } }
)

Consider a collection students2 with the following documents:考虑一个集合students2带有以下文档:

{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 8 },
      { "grade" : 85, "mean" : 90, "std" : 6 },
      { "grade" : 85, "mean" : 85, "std" : 8 }
   ]
}
{
   "_id" : 2,
   "grades" : [
      { "grade" : 90, "mean" : 75, "std" : 8 },
      { "grade" : 87, "mean" : 90, "std" : 5 },
      { "grade" : 85, "mean" : 85, "std" : 6 }
   ]
}

To modify the value of the std field for all elements in the grades array, use the positional $[] operator:要修改grades数组中所有元素的std字段值,请使用位置$[]运算符:

db.students2.update(
   { },
   { $inc: { "grades.$[].std" : -2 } },
   { multi: true }
)

After the operation, the collection has the following documents:操作完成后,集合具有以下文档:

{
   "_id" : 1,
   "grades" : [
      { "grade" : 80, "mean" : 75, "std" : 6 },
      { "grade" : 85, "mean" : 90, "std" : 4 },
      { "grade" : 85, "mean" : 85, "std" : 6 }
   ]
}
{
   "_id" : 2,
   "grades" : [
      { "grade" : 90, "mean" : 75, "std" : 6 },
      { "grade" : 87, "mean" : 90, "std" : 3 },
      { "grade" : 85, "mean" : 85, "std" : 4 }
   ]
}

Update Arrays Specified Using a Negation Query Operator更新使用否定查询运算符指定的数组

Consider a collection results with the following documents:考虑集合results带有以下文档:

{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

To increment all elements in the grades array by 10 for all documents except those with the value 100 in the grades array, use the all positional $[] operator:要将除grades数组中值为100的文档之外的所有文档的grades数组中的所有元素增加10,请使用所有位置运算符$[]

db.results.update(
   { "grades" : { $ne: 100 } },
   { $inc: { "grades.$[]": 10 } },
   { multi: true }
)

The all positional $[] operator acts as a placeholder for all elements in the array field.所有位置运算符$[]充当数组字段中所有元素的占位符。

After the operation, the students collection contains the following documents:操作完成后,students集合包含以下文档:

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

Update Nested Arrays in Conjunction with $[<identifier>]结合使用$[<identifier>]更新嵌套数组

The $[] positional operator, in conjunction with filter $[<identifier>] positional operator can be used to update nested arrays.$[]位置运算符与筛选器$[<identifier>]位置运算符一起可用于更新嵌套数组。

Create a collection students3 with the following documents:创建一个students3集合带有以下文档:

db.students3.insert([
   { "_id" : 1,
      "grades" : [
        { type: "quiz", questions: [ 10, 8, 5 ] },
        { type: "quiz", questions: [ 8, 9, 6 ] },
        { type: "hw", questions: [ 5, 4, 3 ] },
        { type: "exam", questions: [ 25, 10, 23, 0 ] },
      ]
   }
])

To update all values that are greater than or equal to 8 in the nested grades.questions array, regardless of type:更新嵌套grades.questions数组中大于或等于8的所有值,无论类型:

db.students3.update(
   {},
   { $inc: { "grades.$[].questions.$[score]": 2 } },
   { arrayFilters: [  { "score": { $gte: 8 } } ], multi: true}
)