2016-12-02 7 views
0

(文書)UNRの一致がある場合、私は、各コレクションを反復処理し、チェックしたいはpymongo

{ 
    "_id" : ObjectId("53490030cf3b942d63cfbc7b"), 
    "uNr" : "abdc123abcd", 
} 

を次のように私はMongoDBの中に5つのコレクションに同様のデータを持っていますどのコレクションでも。その場合は、そのuNrを追加し、新しいテーブルに+1を数えます。たとえば、3つのコレクションに一致するものがある場合は、表示する必要があります。{"uNr" : "abcd123", "count": "3"}

私はpythonの初心者なので、どこから始めるべきか分かりません。いくつかのアドバイスに感謝します。 UNR値のあなたの総数は(それらのせいぜい数百万)のメモリに収まるほど小さい場合

+0

新しいテーブルに*数+1 *によってあなたに何を意味するの?コレクション内のドキュメントを更新しようとしていますか? – styvane

+0

特定のuNrがすべてのコレクションを通じて繰り返された回数だけです。 – Extria

答えて

1

、あなたはカウンターでそれらをクライアント側を合計し、MongoDBのコレクションに保存することができます

from collections import Counter 
from pymongo import MongoClient, InsertOne 

db = MongoClient().my_database 

counts = Counter() 

for collection in [db.collection1, 
        db.collection2, 
        db.collection3]: 
    for doc in collection.find(): 
     counts[doc['uNr']] += 1 

# Empty the target collection. 
db.counts.delete_many({}) 

inserts = [InsertOne({'_id': uNr, 'n': cnt}) for uNr, cnt in counts.items()] 
db.counts.bulk_write(inserts) 

そうでない場合は、一度に千のUNR値を照会および更新は、別のコレクションにカウント:

from pymongo import MongoClient, UpdateOne, ASCENDING 

db = MongoClient().my_database 

# Empty the target collection. 
db.counts.delete_many({}) 
db.counts.create_index([('uNr', ASCENDING)]) 

for collection in [db.collection1, 
        db.collection2, 
        db.collection3]: 
    cursor = collection.find(no_cursor_timeout=True) 
    # "with" statement helps ensure cursor is closed, since the server will 
    # never auto-close it. 
    with cursor: 
     updates = [] 
     for doc in cursor: 
      updates.append(UpdateOne({'_id': doc['uNr']}, 
            {'$inc': {'n': 1}}, 
            upsert=True)) 

      if len(updates) == 1000: 
       db.counts.bulk_write(updates) 
       updates = [] 

     if updates: 
      # Last batch. 
      db.counts.bulk_write(updates) 
+0

お返事ありがとうございます。しかし、もし私が各コレクションに330mln uNrのようなものを持っていたらどうしますか? – Extria

+0

大きなデータセットを処理するために私の答えが更新されました。 –