2016-08-17 3 views
0

어제 mongodb 작업을 시작했습니다. 저는 1 억 개와 3 억 개의 문서를 가진 동일한 데이터베이스에 두 개의 콜렉션을 가지고 있습니다. 두 번째 컬렉션의 문서에서 문서의 값을 찾을 수없는 경우 한 컬렉션에서 문서를 제거하고 싶습니다. 어쩌면 이것을 좀 더 명확하게하기 위해 아래에 파이썬/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에서 수행되는 미세 이대로 가장 효율적인 방법을 찾고 있어요. 이것을 읽어 주셔서 고마워요. 그리고 제발 열심히 권해주십시오. document["arbitrary"]가 immuable 값인 경우

+0

참고 :'document'는 의사 코드에 두 번 나타납니다. 혼란 스럽습니다. =>'doc_one'과'doc_two'의 이름을 바꿀 수 있습니까? –

답변

0

, 당신은 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 ​​= (document [ "arbitrary"] for db.collection_TWO)? Collection_TWO에는 "임의"에 대한 복제본이없고 collection_ONE 만 있습니다. 이것은 내가 한 번만해야 할 일이지만, 컬렉션의 크기로 할 수 있습니다, 나는 나의 방법이 꽤 오래 걸릴 것 같네요. 일종의 비밀 소스가 있는지 확실하지 않았습니다. 그래서 중요한 것은 collection_ONE의 문서가 doc_ONE [ "arbitrary"] 값이 doc_TWO [ "arbitrary"]에 존재할 때만 존재해야한다는 것입니다. 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 [ "arbitrary"]'값을 삭제합니다. 그것은 어떤 가치가 있습니까? 'int'? 'str'? 나는 파이썬이 엄청난 수의 int 나 str을 메모리에 저장할 수 있다는 것을 알고있다. –

+0

그래, 좋은 방법인데, 내 목록 방법보다 빠르다. 나의 유일한 관심사는 기억이다. collection_TWO에는 3 억 개의 항목이 있습니다. 문자열 값은 40 자입니다. – Beetle

관련 문제