【问题标题】:Remove documents from a collection based on value located in another collection根据位于另一个集合中的值从集合中删除文档
【发布时间】:2016-08-18 05:58:23
【问题描述】:

我昨天开始使用 mongodb。我在同一个数据库中有两个集合,分别包含 1 亿和 3 亿个文档。如果在第二个集合的任何文档中都找不到文档中的值,我想删除一个集合中的文档。为了更清楚地说明这一点,我在下面提供了 python/mongodb 伪代码。我意识到这不是正确的语法,它只是为了展示我所追求的逻辑。我正在寻找最有效的方法,因为我的笔记本电脑上有很多记录和它:)

for doc_ONE in db.collection_ONE:
    if doc_ONE["arbitrary"] not in [doc_TWO["arbitrary"] for doc_TWO in db.collection_TWO]:
        db.collection_ONE.remove({"arbitrary": doc_ONE["arbitrary"]})

如果更快的话,我可以从 mongo cli 完成这项工作。感谢您阅读本文,请不要对我发火,哈哈。

【问题讨论】:

  • 注意:document 在您的伪代码中出现两次,令人困惑。你能重命名 => doc_onedoc_two 吗?

标签: python mongodb


【解决方案1】:

如果document["arbitrary"] 是不可变值,您可以将所有值(不重复)存储在set 中:

values = {document["arbitrary"] for document in db.collection_TWO}

你建议的过程:

for doc_one in db.collection_ONE:
    if doc_one["arbitrary"] not in values:
        db.collection_ONE.remove({"arbitrary": doc_one["arbitrary"]})

【讨论】:

  • 您的意思是值是:values = (document["arbitrary"] for document in db.collection_TWO)? Collection_TWO 没有“任意”的重复项,只有 collection_ONE。这是我只需要做一次的事情,但是对于集合的大小,我担心我的方法需要相当长的时间。我不确定是否有某种秘方。所以,主要的是,collection_ONE 中的文档应该仅在 doc_ONE["arbitrary"] 值存在于 doc_TWO["arbitrary"] 中时才存在。 collection_ONE 文档依赖于 collection_TWO 中的信息。
  • 是的,values 是现有 document["arbitrary"] 值的 setfrozsenset。它的价值是什么? int? str?我相信 Python 可以在内存中存储大量的 intstr...
  • 是的,这是一个很棒的方法,比我的列表方法快得多。我唯一关心的是记忆。 collection_TWO 有 3 亿个条目。它是一个 40 个字符的字符串值。
  • 至少 11 去!可能在 RAM 上:它会交换一点……
  • 会给你胜利。将测试它。可能不得不以某种方式打破它,但我认为这将是最好的方法。谢谢!
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多