$[]

在本页面

Definition

  • $[]
    • 3.6 版的新功能。

所有位置运算符$[]指示更新运算符应修改指定数组字段中的所有元素。

$[]运算符的格式如下:

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

用于更新操作,例如db.collection.update()db.collection.findAndModify(),以修改一个或多个符合查询条件的文档的所有数组元素。例如:

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

有关示例,请参见更新数组中的所有元素

Behavior

upsert

如果upsert操作导致插入,则query必须在数组字段上包含完全相等的 match以便在 update 语句中使用$[]位置运算符。

例如,下面的更新操作在更新文档中使用$[],它在数组字段上指定完全相等的匹配条件:

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

如果不存在此类文档,则该操作将导致插入以下文档:

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

如果 upsert 操作不包括完全相等的匹配项,并且找不到匹配的文档要更新,则 upsert 操作将出错。

例如,如果找不到匹配的文档来更新,则以下操作将出错:

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

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

Nested Arrays

$[]运算符可用于遍历多个数组和嵌套数组的查询。

有关示例,请参见使用$ [\ <identifier>]联合更新嵌套数组

Examples

更新数组中的所有元素

考虑包含以下文档的集合students

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

要将集合中所有文档的grades数组中的所有元素增加10,请使用所有位置$[]运算符:

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

全位置$[]运算符充当数组字段中所有元素的占位符。

操作完成后,students集合包含以下文档:

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

更新数组中的所有文档

$[]位置运算符有助于更新包含嵌入式文档的数组。要访问嵌入文档中的字段,请使用$[]运算符上的dot notation

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

考虑包含以下文档的集合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 }
   ]
}

要为grades数组中的所有元素修改std字段的值,请使用位置$[]运算符:

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

操作后,集合具有以下文档:

{
   "_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 }
   ]
}

使用否定查询运算符指定的更新数组

考虑包含以下文档的集合results

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

要将grades数组中所有值100除外的所有文档** _ 2 数组中的所有元素增加10,请使用所有位置$[]运算符:

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

全位置$[]运算符充当数组字段中所有元素的占位符。

操作完成后,students集合包含以下文档:

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

与$ [\ <identifier>]联合更新嵌套数组

$[]位置运算符与过滤器$[<identifier>]位置运算符一起可用于更新嵌套数组。

创建包含以下文档的集合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 ] },
      ]
   }
])

要更新嵌套grades.questions数组中的所有大于或等于8的值,而不考虑type

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