根据条件从集合中删除文档

时间:2021-05-31 11:04:33

标签: mongodb mongodb-query

我想从集合(Collection1)中删除与其他集合(Collection2)不匹配的文档。

collection1 文档 - {_id: <autogen>, items: [{key:'key', ...}}]

collection2 文档 - {_id: 'key', action: {key1:'key1', ...}}, {_id: 'non_matching_key', action: {key1:'key1', ...}}

删除collection2中的所有文档,其中collection1中的items.key与collection2中的_id不匹配。参考上面的例子,一个key-value为'non_matching_key'的文档应该从collection2中删除。在 collection2 中会有类似的文档,比如 _id 值为 'non_matching_key' 的文档。

我认为的方法是标记和清除。

  • 我将在 collection2 文档中添加列以匹配 id(在 collection2 中与 collection1 中的 items.key)。这是标记步骤
  • 从 collection2 中删除所有新添加的列不存在的文档。这是清扫步骤。

请您建议是否有更好的方法来做到这一点?

谢谢,

2 个答案:

答案 0 :(得分:0)

不完全清楚您的文档是什么样子以及具体条件是什么,但您可以这样做:

var ids = db.collection1.find({}, { "item.key": 1 }).toArray();
db.collection2.deleteMany({ _id: { $nin: ids } });

答案 1 :(得分:0)

因此,基本上,您想遍历集合 2 并获取所有不在集合 1 中的 ID,然后删除它们,反之亦然。

db.collection2.find({}).forEach((doc) => db.collection1.deleteOne({_id: {$ne: doc._id}}))

or

let idsToDelete = db.collection2.find({}).distinct('_id')
let deleteResponse = db.collection1.deleteMany({_id: {$nin: idsToDelete}})

在另一种情况下交换集合名称。

注意:代码仅用于概述,未经测试。