2017-12-04 1 views
1

あるコレクションから別のコレクションにレコードを移動する適切な方法は何ですか?私はthisのようないくつかの他の人の投稿に出くわしました。同じ目標を達成していますが、どれもがPythonの実装を持っていません。あるコレクションから別のコレクションへレコードを移動するPyMongo

#Taking a number of records from one database and returning the cursor 
cursor_excess_new = db.test_collection_new.find().sort([("_id", 1)]).limit(excess_num) 


# db.test.insert_many(doc for doc in cursor_excess_new).inserted_ids 


# Iterating cursor and Trying to write to another database 
# for doc in cursor_excess_new: 
#  db.test_collection_old.insert_one(doc) 
result = db.test_collection_old.bulk_write([ 
    for doc in cursor_excess_new: 
     InsertMany(doc for each doc in cur) 
     pprint(doc) 
]) 

私はinsert_manyを使用している場合は、私は次のエラーを取得する:pymongo.errors.OperationFailure: Writes to config servers must have batch size of 1, found 10

bulk_writeは、forループの開始時に私に構文エラーを与えています。

pymongoのレコードをあるコレクションから別のコレクションに転送するためのベストプラクティスと正しい方法は何ですか?

答えて

1

Collection.bulk_writeは、クエリ操作の反復可能性を引数として受け取ります。

pymongoは、pymongo.operations.InsertOneの操作がありません。 InsertManyです。

状況に応じて、ソースコレクション内の各ドキュメントに対してInsertOne操作の一覧を作成できます。組み立てられた操作のリストを使用して、送り先でbulk_writeを実行します。

from pymongo import InsertOne 
... 
cursor_excess_new = (
    db.test_collection_new 
     .find() 
     .sort([("_id", 1)]) 
     .limit(excess_num) 
) 

queries = [InsertOne(doc) for doc in cursor_excess_new] 
db.test_collection_old.bulk_write(queries) 
関連する問題