【问题标题】:Removing a subdocument from array in MongodDB从 MongodB 的数组中删除子文档
【发布时间】:2013-07-23 06:58:38
【问题描述】:

我正在使用 node 和 mongodb,但在从我的集合中的数组中删除子文档时遇到问题,我似乎无法弄清楚。

我的“cardHolders”集合中的示例文档看起来像(为简洁起见,去掉了其他字段):

{
    "_id" : ObjectId("51ee899ec15d5aaff39d3352"),
    "cards" : [
            {
               "rfid_id" : ObjectId("51ee899ec15d5aaff39d335a")
            }
    ]
}

我试图做的是在卡片数组中找到所有具有 rfid_id 值的子文档的 cardHolder 文档。

我试过 mongo 命令:

db.cardholders.update({}, 
    {$pull:{ "cards": {"rfid_id": ObjectId("51ee899ec15d5aaff39d335a")}}},
    false, false)

虽然我没有收到任何语法错误,但我的收藏中的任何文档都不会受到影响 - 非常感谢您对此事的任何帮助!

使用完整的文档详细信息进行编辑:

{
    "_id" : ObjectId("51ee899ec15d5aaff39d3353"),
    "first" : "first",
    "last" : "last",
    "email" : "email",
    "phone" : "555 555 5555",
    "userRole" : "su",
    "cards" : [
            {
                    "rfid_id" : ObjectId("51ee899ec15d5aaff39d3359")
            }
    ],
    "zones" : [
            {
                    "zone_id" : ObjectId("51ee899ec15d5aaff39d3357")
            }
    ]
}

【问题讨论】:

  • 您是否尝试过在 rfid_id 上使用 $elemMatch 来匹配特定元素?
  • 我现在使用:db.cardholders.update({}, {$pull:{ "cards": {$elemMatch: {rfid_id: ObjectId("51ee899ec15d5aaff39d335a")}}}}, false , false) 结果相同(无)
  • 您原来问题中的代码在我尝试时成功删除了cards数组元素。
  • 很奇怪,它确实与该对象的剥离版本有关。我编辑了我的问题以包含我正在使用的完整文档,我认为剥离其他字段会简化问题 - 我想我错了

标签: mongodb


【解决方案1】:

您的示例运行良好:

db.so.drop();
db.so.insert(
{
    "_id" : ObjectId("51ee899ec15d5aaff39d3353"),
    "first" : "first",
    "last" : "last",
    "email" : "email",
    "phone" : "555 555 5555",
    "userRole" : "su",
    "cards" : [
            {
                    "rfid_id" : ObjectId("51ee899ec15d5aaff39d3359")
            }
    ],
    "zones" : [
            {
                    "zone_id" : ObjectId("51ee899ec15d5aaff39d3357")
            }
    ]
});

db.so.update({}, {$pull:{ "cards": {"rfid_id": ObjectId("51ee899ec15d5aaff39d3359")}}}, false, false)
db.so.find().pretty();

输出:

{
    "_id" : ObjectId("51ee899ec15d5aaff39d3353"),
    "cards" : [ ],
    "email" : "email",
    "first" : "first",
    "last" : "last",
    "phone" : "555 555 5555",
    "userRole" : "su",
    "zones" : [
        {
            "zone_id" : ObjectId("51ee899ec15d5aaff39d3357")
        }
    ]
}

虽然我确实不得不稍微更改拉取的 ObjectID,因为它最初在文档的简单版本和完整版本之间使用不同的字符串。

【讨论】:

  • 我接受了这个答案,因为它应该可以工作 - 但是,我们最终要让它工作的是添加一个 upsert: db.so.update({}, {$pull:{ "cards ": {"rfid_id": ObjectId("51ee899ec15d5aaff39d3359")}}}, {upsert:false, multi:true}) 终于奏效了——谢谢大家!
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2017-08-22
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2015-05-01
相关资源
最近更新 更多