定义
- $[]
- 所有位置运算符 - $[]表示该更新运算符应修改指定数组字段中的所有元素。- $[]操作符采用以下形式:- { <update operator>: { "<array>.$[]" : value } } - 用于更新操作,例如 - db.collection.updateOne()和- db.collection.findAndModify(),以修改符合该查询条件的文档的所有数组元素。例如:- db.collection.updateOne( - { <query conditions> }, - { <update operator>: { "<array>.$[]" : value } } - ) - 有关示例,请参阅更新数组中的所有元素。 
行为
从 MongoDB 5.0 开始,更新操作符按字典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。详情请参阅更新操作符行为。
upsert
如果 upsert 操作触发插入,query 则须包含针对该数组字段的完全相等匹配项,以便在更新语句中使用 $[] 位置运算符。
例如,以下 upsert 操作将在更新文档中使用 $[] 来指定针对该数组字段的完全相等匹配条件:
db.collection.updateOne(    { myArray: [ 5, 8 ] },    { $set: { "myArray.$[]": 10 } },    { upsert: true } ) 
如果不存在此类文档,此操作则会插入以下文档:
{ "_id" : ObjectId(...), "myArray" : [ 10, 10 ] } 
如果此 upsert 操作不含完全相等匹配项,且未找到要更新的匹配文档,此操作则会出错。
例如,如果找不到匹配的文档进行更新,以下操作就会出错:
db.emptyCollection.updateOne(    { },    { $set: { "myArray.$[]": 10 } },    { upsert: true } ) db.emptyCollection.updateOne(    { myArray: 5 },    { $set: { "myArray.$[]": 10 } },    { upsert: true } ) 
嵌套数组
$[] 运算符可用于会遍历多个数组和嵌套数组的查询。
有关示例,请参阅搭配使用 $[<identifier>] 以更新嵌套数组。
示例
更新数组中的所有元素
创建 students 集合:
db.students.insertMany( [    { "_id" : 1, "grades" : [ 85, 82, 80 ] },    { "_id" : 2, "grades" : [ 88, 90, 92 ] },    { "_id" : 3, "grades" : [ 85, 100, 90 ] } ] ) 
要将集合中所有文档的 grades 数组中的所有元素递增 10,请使用所有位置 $[] 操作符:
db.students.updateMany(    { },    { $inc: { "grades.$[]": 10 } }, ) 
所有位置运算符 $[] 会充当该数组字段中所有元素的占位符。
操作完成后,students 集合包含以下文档:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 102 ] } { "_id" : 3, "grades" : [ 95, 110, 100 ] } 
更新数组中的所有文档
$[] 位置操作符便于更新包含嵌入式文档的数组。要访问嵌入文档中的字段,请使用带有 $[] 操作符的点表示法 。
db.collection.updateOne(    { <query selector> },    { <update operator>: { "array.$[].field" : value } } ) 
创建 students2 集合:
db.students2.insertMany( [    {       "_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.updateMany(    { },    { $inc: { "grades.$[].std" : -2 } }, ) 
操作完成后,集合有以下文档:
{    "_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 集合:
db.results.insertMany( [    { "_id" : 1, "grades" : [ 85, 82, 80 ] },    { "_id" : 2, "grades" : [ 88, 90, 92 ] },    { "_id" : 3, "grades" : [ 85, 100, 90 ] } ] ) 
要将除 grades 数组中值为 100 的文档之外的所有文档的 grades 数组中的所有元素递增 10,请使用所有位置 $[] 操作符:
db.results.updateMany(    { "grades" : { $ne: 100 } },    { $inc: { "grades.$[]": 10 } }, ) 
所有位置运算符 $[] 会充当该数组字段中所有元素的占位符。
操作完成后,students 集合包含以下文档:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 102 ] } { "_id" : 3, "grades" : [ 85, 100, 90 ] } 
更新嵌套数组 $[<identifier>]
$[] 位置操作符与筛选器 $[<identifier>] 位置操作符共同使用,可更新嵌套数组。
使用以下文档创建集合 students3:
db.students3.insertMany( [    { "_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.updateMany(    {},    { $inc: { "grades.$[].questions.$[score]": 2 } },    { arrayFilters: [  { "score": { $gte: 8 } } ] } ) 
更新后的文档如下所示:
{   _id: 1,   grades: [     { type: 'quiz', questions: [ 12, 10, 5 ] },     { type: 'quiz', questions: [ 10, 11, 6 ] },     { type: 'hw', questions: [ 5, 4, 3 ] },     { type: 'exam', questions: [ 27, 12, 25, 0 ] }   ] }