2016-08-17 84 views
0

我昨天开始使用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"]}) 

我很好这是从蒙戈CLI做,如果快。感谢您阅读本文,请不要让我难以忍受哈哈。

+0

注意:''文件'出现两次在你的伪代码中,令人困惑。你可以重命名=>“doc_one”和“doc_two”吗? –

回答

0

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

值= {文档[ “任意” 用于在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"]}) 
+0

你的意思是:values =(文档[“任意”]为db.collection_TWO中的文档)? Collection_TWO没有“任意”的副本,只有collection_ONE。这是我只需要做一次的事情,但是对于收藏的大小来说,恐怕我的方法需要一段时间。我不确定是否有某种秘密酱料。所以,最重要的是,只有当doc_ONE [“任意”]值存在于doc_TWO [“任意”]时,collection_ONE中的文档才应该存在。 collection_ONE文档取决于collection_TWO中的信息。 – Beetle

+0

是的,'values'是[** set **](https://docs.python.org/2/library/functions.html#func-set)或[** frozsenset **](https:/ /docs.python.org/2/library/functions.html#func-frozenset)现有的'document [“任意”]'值。它有什么样的价值? 'int'? 'str'?我是sur python可以在内存中存储大量的int或str ... –

+0

是的,它是一种很棒的方法,它比我的列表方法更快。我唯一关心的是记忆。 collection_TWO有3亿条记录。这是一个40个字符的字符串值。 – Beetle

相关问题