我的收藏(称为“工人”):
"_id" : "500"
"type" : "Manager",
"employees" : [{
"name" : "bob"
"id" : 101
},{
"name" : "phil"
"id" : 102
}]
目标:对于每个类型的_id:Manager AND包含“id”为102的子文档:将102替换为202.
期望的最终结果:
"_id" : "500"
"type" : "Manager",
"employees" : [{
"name" : "bob"
"id" : 101
},{
"name" : "phil"
"id" : 202
}]
我试过了:
db.workers.update({type:'Manager','employees.id':'102'},{$set:{'employees.id':'202'}},{multi:true})
然后我做了以下两件事来验证:
db.workers.find({type: "Manager", 'employees.id': 102}).count()
我得到9的结果。
我也试过这个来验证:
db.workers.find({$and: [{type: "Manager"},{"employees.id":60}]}).count()
这返回0。
此时我很困惑。我的更新错了吗?我发现错了吗?两者都是吗? “9”结果错了吗? '0'错了吗?
答案 0 :(得分:4)
您需要使用$
positional update运算符更新与查询匹配的特定元素。您的更新还使用了'102'
和'202'
的值,这使得更新会在字段为数字时尝试匹配字符串。
您的更新应该是这样的:
db.workers.update(
{type: 'Manager', 'employees.id': 102},
{$set: {'employees.$.id': 202}},
{multi: true})