9

mongo コレクションの何千ものドキュメントを更新したいと考えています。ObjectId を使用してそれらを検索し、一致するドキュメントを更新する必要があります。私の更新はすべてのドキュメントで同じです。ObjectId のリストがあります。リスト内のすべての ObjectId について、mongo は一致するドキュメントを見つけ、そのドキュメントの「isBad」キーを「N」に更新する必要があります。

ids = [ObjectId('56ac9d3fa722f1029b75b128'), ObjectId('56ac8961a722f10249ad0ad1')]
bulk = db.testdata.initialize_unordered_bulk_op()
bulk.find( { '_id': ids} ).update( { '$set': {  "isBad" : "N" } } )
print bulk.execute()

これにより結果が得られます:

{'nModified': 0, 'nUpserted': 0, 'nMatched': 0, 'writeErrors': [], 'upserted': [], 'writeConcernErrors': [], 'nRemoved': 0, 'nInserted': 0}

これは、"_id" をリストと一致させようとしているためです。しかし、私は進む方法がわかりません。

すべてのドキュメントを個別に更新する方法を知っています。私のリストのサイズは 25000 のオーダーです。25000 の呼び出しを個別に行いたくありません。私のコレクションのドキュメントの数ははるかに多くなっています。私はpython2、pymongo = 3.2.1を使用しています。

4

3 に答える 3

18

Iterate through the id list using a for loop and send the bulk updates in batches of 500:

bulk = db.testdata.initialize_unordered_bulk_op()
counter = 0

for id in ids:
    # process in bulk
    bulk.find({ '_id': id }).update({ '$set': { 'isBad': 'N' } })
    counter += 1

    if (counter % 500 == 0):
        bulk.execute()
        bulk = db.testdata.initialize_ordered_bulk_op()

if (counter % 500 != 0):
    bulk.execute()

Because write commands can accept no more than 1000 operations (from the docs), you will have to split bulk operations into multiple batches, in this case you can choose an arbitrary batch size of up to 1000.

The reason for choosing 500 is to ensure that the sum of the associated document from the Bulk.find() and the update document is less than or equal to the maximum BSON document size even though there is no there is no guarantee using the default 1000 operations requests will fit under the 16MB BSON limit. The Bulk() operations in the mongo shell and comparable methods in the drivers do not have this limit.

于 2016-02-18T12:02:05.687 に答える
3
bulk = db.testdata.initialize_unordered_bulk_op()

for id in ids:
   bulk.find( { '_id':  id}).update({ '$set': {  "isBad" : "N" }})

bulk.execute()
于 2021-01-16T00:26:19.373 に答える