【问题标题】:Delete documents from collection based on condition根据条件从集合中删除文档
【发布时间】:2021-08-18 16:32:37
【问题描述】:

我想从一个集合(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 不匹配。参考上面的例子,一个键值“non_matching_key”的文档应该从collection2中删除。在 collection2 中会有类似的文档,比如 _id 值为 'non_matching_key' 的文档。

我认为的方法是标记和扫描。

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

您能否告知是否有更好的方法?

谢谢,

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,$nin 是“关键”,明白了。我会试试这个。文档结构有更新。结构发生了变化,现在“项目”是 collection1 中的一个数组。更新了原帖。
    • 更新:重新构建新结构。结构:文档 - {a: b:[c:'']} var finalArray = []; var ids = db.smaDoc.find({"abc": { $exists: true}}, {'abc': 1, _id: 0}) .limit(10).forEach(function(document) { for( var i=0;i
    • 另外,上面的查询可以得到finalArray的改进吗?
    • 如果您提供适当的样本数据,我可以提供帮助。您提供的虚假结构并没有真正的用处。
    【解决方案2】:

    所以基本上,你想遍历你的集合 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}})
    

    在其他情况下交换集合名称。

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

    【讨论】:

    • 第一个会很慢,完全不推荐。
    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2020-07-25
    • 2017-08-29
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多