定义
定位符$的确定数组中一个要被更新的元素的位置,而不用具体指定该元素在数组中的位置。
用法
1.更新数组中的值
1)语法格式
{"<array>.$": value}
2)示例
创建集合students有以下文档:
db.students.insert([
{ "_id" : 1, "grades" : [ 85, 80, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
])
将grades数组中第一个值为80更新为82,如果你不知道第一个值的具体位置,就可以像下面这样写:
db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)
定位符$像一个占位符,匹配第一个符合查询条件的值的位置。
2.更新数组中的文档
定位符
为更新那些包含嵌入文档的数组提供了方便。要取得嵌入文档中的字段属性值,在
后面使用点符号。如一下语法格式描述:
1)语法格式
db.collection.update(
{ <query selector> },
{ <update operator>: { "array.$.field" : value } }
)
2)举例
假设students集合中grades数组包含以下嵌入的文档:
{
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 85, mean: 85, std: 8 }
]
}
使用$定位符去更新grades数组中文档中字段std的值,被更新的文档是第一个匹配grade值为85的文档。如下:
db.students.updateOne(
{ _id: 4, "grades.grade": 85 },
{ $set: { "grades.$.std" : 6 } }
)
跟新后的结果为:
{
"_id" : 4,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 8 },
{ "grade" : 85, "mean" : 90, "std" : 6 },
{ "grade" : 85, "mean" : 85, "std" : 8 }
]
}