删除MongoDB中数组的嵌套对象中的元素

时间:2017-01-04 11:49:29

标签: mongodb mongodb-query

我有以下包含数组的示例数据。我试图从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)

你可以看看我的查询吗?可能是什么问题?

1 个答案:

答案 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);
  });