我有以下包含数组的示例数据。我试图从messages数组中取消设置或删除嵌套对象。
{
"_id" : ObjectId("51e98d196b01c2085c72d731"),
"messages" : [ { "defaultId" :{
"_id" : ObjectId("520167056b01c20bb9eee987")
},
"id" : ObjectId("520167056b01c20bb9eee988")
}
]
}
db.rename_collection.update({"messages._id":{$exists: true}},
{$unset: {"messages.$.defauliId": {"_id": ""} }} )
结果:什么都没有 - 没有错误也没有未设置。
我必须对上述数据执行一些额外的操作: - 我必须将“id”属性名称设置为“userId”。 - 添加新信息“id”:“newInfo”(我希望我可以使用$ addToSet)
你可以看看我的查询吗?可能是什么问题?答案 0 :(得分:0)
根据您的示例数据,您应使用messages.id
代替messages._id
并输入错误
defaultId
代替defauliId
如果您的messages
数组包含一个对象
db.rename_collection.update({"messages.id":{$exists: true}},
{$unset: {"messages.$.defaultId": {"_id": ""} }},{multi:true} )
也可以使用{$unset: {"messages.$.defaultId": true }}
删除defaultId
对象。
如果您的messages
包含多个对象,则上述查询将不会更新所有messages
个对象。因为目前 MongoDB 不允许位置运算符 $
更新数组的所有元素。因此,要更新所有messages
个对象,您可以按照此过程进行操作。
db.rename_collection.find({})
.forEach(function (doc) {
doc.messages.forEach(function (message) {
if (message.id) {
delete message.defaultId;
}
});
db.rename_collection.save(doc);
});