2016-08-17 83 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

相關問題