【问题标题】:Remove the element in the nested object of an array in MongoDB删除MongoDB中数组的嵌套对象中的元素
【发布时间】:2017-05-18 16:50:18
【问题描述】:

我有以下包含数组的示例数据。我试图从消息数组中取消设置或删除嵌套对象。

样本数据:

{
"_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)

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

【问题讨论】:

  • 查询部分应该是“messages.id”??

标签: mongodb mongodb-query


【解决方案1】:

根据您的示例数据,您应该使用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 不允许 位置运算符 $ 更新 array 的所有元素。因此,要更新所有 messages 对象,您可以遵循此过程。

db.rename_collection.find({})
  .forEach(function (doc) {
    doc.messages.forEach(function (message) {
      if (message.id) {
        delete message.defaultId;
      }
    });
    db.rename_collection.save(doc);
  });

【讨论】:

  • 即使更正了我的查询,我也没有得到任何结果:Result:: { "ok" : 1, "nInserted" : 0, "nUpserted" : 0, "nMatched" : 1, "nModified " : 0, "nRemoved" : 0 }
  • 如果messages 包含一个对象,应该是第一个查询。如果messages 中有多个对象,则可以遵循第二个过程。可以看到更新的答案@M.S.Naidu
  • 谢谢@Shaish,它现在可以工作了,但实际上我想保持“_id”值不变,需要将名称从“_id”更改为“userId”。
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
相关资源
最近更新 更多