【问题标题】:Removing Non-Collection Embedded Document via Mongo Shell通过 Mongo Shell 删除非集合嵌入文档
【发布时间】:2013-06-24 21:33:15
【问题描述】:

所以我有一个使用大量嵌入式文档的应用程序,这很好。但是我注意到,当您在 Mongo shell 中 show collections 时,一些嵌入式文档不会显示。

通常这不是问题,但是在设置嵌入文档时,我不小心在其中一个条目中添加了一个空条目。我通常会做这样的事情来删除条目db.collection.remove({_id: ObjectId('<OBJECT_ID>')}),但由于其中一些不是实际的集合,我无法这样做。

我也不确定在实际删除文档时如何成功拼接。我可以将它从条目中拼接出来,但我感觉它会使嵌入的文档在数据库中的某个地方浮动。

任何想法如何做到这一点?

为了让你知道我在说什么,一个条目的例子:

entry = {
    _id: ObjectId('blah blah blah'),
    name: {
        first: 'example',
        last: 'city'
    },
    log : [
        {
            _id: ObjectId('some id'),
            action: 'whatever',
            someField: 'etc.'
        },
        {
            _id: ObjectId('another id')
        },
        {
            _id: ObjectId('yet another id'),
            action: 'who cares',
            someField: 'data'
        }
    ]
}

【问题讨论】:

  • 您要从该文档中删除什么? “日志”条目之一?为什么不使用 db.collection.update({_id:blah blah}, {$pull:{"log._id":another_id}})?
  • 我想删除数组中的单个条目。看来 $pull 是我一直在寻找的东西。如果您想将此作为答案添加一个小解释和文档链接,我很乐意接受您的回答。

标签: mongodb mongo-shell


【解决方案1】:

如果要删除其中一个日志条目,则需要 $pull operator

格式类似于:

db.collection.update({_id:<id-of-document-to-update>},
                     {$pull:{"log._id":<id-of-log-entry-to-remove>"}}
)

这就是说,找到具有特定_id 的文档并从日志数组中删除具有特定sub_id 的条目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多