文档菜单
文档首页
/
MongoDB 手册
/ / / /

$[]

在本页

  • 定义
  • 行为
  • 示例
$[]

全位置操作符 $[] 表示更新操作符应该修改指定数组字段中的所有元素。

$[] 操作符具有以下形式

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

在更新操作中使用,例如db.collection.updateOne()db.collection.findAndModify(),用于修改匹配查询条件的文档或文档中的所有数组元素。例如

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

例如,请参阅更新数组中的所有元素.

从 MongoDB 5.0 开始,更新操作符按照基于字符串的名称的字典顺序处理文档字段。具有数字名称的字段按数字顺序处理。有关详细信息,请参阅更新操作符行为

如果一个upsert操作导致插入,那么查询必须包括对数组字段的一个精确匹配,以便在更新语句中使用$[]位置运算符。

例如,以下使用$[]的更新操作的upsert操作指定了数组字段的精确匹配条件

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

如果不存在这样的文档,该操作将导致插入以下文档

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

如果upsert操作没有包含精确匹配并且没有找到匹配的文档进行更新,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>],可以用来更新嵌套数组。

创建包含以下文档的集合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的值,无论其类型如何

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 ] }
]
}

提示

另请参阅

返回

$ (更新)