通过Mongo Shell删除非收集嵌入式文档

时间:2013-06-24 21:33:16

标签: mongodb mongo-shell

所以我有一个使用大量嵌入式文档的应用程序,这很好。但是我注意到,当您在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'
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

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

格式如下:

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

这就是说,查找包含某些_id的文档,并从日志数组中删除包含某些sub_id的条目。