如何在MongoDB中更新文档内的内嵌对象?
解决MongoDB嵌套子文档被整体替换的问题
嘿,我完全懂你碰到的这个坑!你本来只想更新userInfo里的userName字段,结果不小心把整个userInfo子文档都替换了,原来的organization数组直接没了对吧?
问题出在哪?
你当前写的更新语句:
db.user.update({"_id":ObjectId('5aaa41f96f69440f82ef45a7')},{$set :{"userInfo":{"userName":"kanha"}}})
这里你直接给$set传入了整个userInfo对象,MongoDB会默认认为你要把原有的userInfo子文档完全替换成这个新对象,自然就会丢掉原来的organization字段。
正确的更新方式
要只更新嵌套子文档里的指定字段,你需要用**点符号(dot notation)**精准定位到嵌套字段,这样MongoDB就只会更新你指定的那个字段,同时保留子文档里的其他内容。
正确的更新语句应该是这样:
db.user.update({"_id":ObjectId('5aaa41f96f69440f82ef45a7')}, {$set: {"userInfo.userName": "kanha"}})
更新后的文档效果
执行完上面的语句后,你的文档会变成这样,organization数组会被完整保留:
{ "_id": ObjectId('5aaa41f96f69440f82ef45a7'), "name": "test", "password": "1234", "userInfo": { "userName": "kanha", "organization": [1, 2] } }
额外小技巧
如果需要同时更新嵌套子文档里的多个字段,也可以用点符号一次指定多个:
db.user.update( {"_id":ObjectId('5aaa41f96f69440f82ef45a7')}, {$set: { "userInfo.userName": "kanha", "userInfo.organization": [1,2,3] // 同时更新数组内容 }} )
内容的提问来源于stack exchange,提问作者shilpa
相关产品推荐
相关产品推荐

