【问题标题】:How do you remove an embedded document in MongoDB?如何删除 MongoDB 中的嵌入文档?
【发布时间】:2012-02-16 17:16:32
【问题描述】:

我有一个如下所示的文档:

{listName: 'LoremIpsum'
 listItems: [{productDescription: "", productImage: ""}...]}

如果 productImage 不存在,我将如何从 listItems 中删除项目?

我尝试了以下方法,但没有结果:

db.lists.update({"item.productImage":{$exists: false}}, {$unset:{"item":1}}, false, true )

【问题讨论】:

  • 能否请您更新您的原始文档结构。因为在您的文档中是 listitems.productimage 而在您的查询中是 item.productimage.. 哪个是正确的..

标签: mongodb


【解决方案1】:

注意 $pull 可以包含元素匹配条件。因此,此单一更新将删除不包含字段“productImage”的项目:

db.lists.update({}, {$pull:{listItems:{productImage:{$exists:false}}}}, false, true)

【讨论】:

  • 这行得通。只需编辑命令即可更新所有文档。 db.lists.update({}, {$pull:{listItems:{productImage:{$exists:false}}}},false,true)
【解决方案2】:

看来你不能一步删除它。但这里有一个两步组合:

// unset matching array element. That'll leave null on its place
db.lists.update({"listItems.productImage":{$exists: false}}, 
                {$unset:{"listItems.$":1}});

// remove nulls from array
db.lists.update({listItems: null}, 
                {$pull: {listItems: null}});

【讨论】:

  • 刚刚尝试过,但没有成功。也许是因为它实际上是一个内部数组?
【解决方案3】:

您应该可以使用$pull operator,它将删除所有符合您指定的匹配条件的内容。

db.lists.update({}, {"$pull": {"listItems" : {"productImage" : {$exists: false}} }})

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2019-02-08
    • 2018-07-24
    相关资源
    最近更新 更多