sql >> データベース >  >> NoSQL >> MongoDB

pymongoの高速またはバルクアップサート

    pymongoの最新リリース(3.x以降)は、サーバーリリースがバルク操作をサポートしていない場合にダウングレードする一貫したインターフェイスでバルク操作をラップします。これは、MongoDBで公式にサポートされているドライバーで一貫しています。

    したがって、コーディングに推奨される方法は、bulk_write()を使用することです。 代わりに、UpdateOneを使用します 代わりに、他の適切な操作アクション。そしてもちろん、特定のビルダーではなく、自然言語リストを使用することをお勧めします

    古い文書の直接翻訳:

    from pymongo import UpdateOne
    
    operations = [
        UpdateOne({ "field1": 1},{ "$push": { "vals": 1 } },upsert=True),
        UpdateOne({ "field1": 1},{ "$push": { "vals": 2 } },upsert=True),
        UpdateOne({ "field1": 1},{ "$push": { "vals": 3 } },upsert=True)
    ]
    
    result = collection.bulk_write(operations)
    

    または、従来のドキュメント変換ループ:

    import random
    from pymongo import UpdateOne
    
    random.seed()
    
    operations = []
    
    for doc in collection.find():
        # Set a random number on every document update
        operations.append(
            UpdateOne({ "_id": doc["_id"] },{ "$set": { "random": random.randint(0,10) } })
        )
    
        # Send once every 1000 in batch
        if ( len(operations) == 1000 ):
            collection.bulk_write(operations,ordered=False)
            operations = []
    
    if ( len(operations) > 0 ):
        collection.bulk_write(operations,ordered=False)
    

    返される結果はBulkWriteResultです。 これには、一致および更新されたドキュメントのカウンターと、返された_idが含まれます。 発生する「アップサート」の値。

    バルク操作配列のサイズについては、少し誤解があります。サーバーに送信される実際のリクエストは、16MBのBSON制限を超えることはできません。この制限は、BSON形式を使用しているサーバーに送信される「リクエスト」にも適用されるためです。

    ただし、実際の操作はとにかく1000のバッチでのみ送信および処理されるため、これは作成できる要求配列のサイズには影響しません。唯一の実際の制限は、これらの1000の操作命令自体が実際には16MBを超えるBSONドキュメントを作成しないことです。これは確かにかなり難しい注文です。

    バルクメソッドの一般的な概念は、一度に多くのものを送信し、1つのサーバー応答のみを処理する結果として、「トラフィックが少ない」ことです。すべての更新リクエストに付随するオーバーヘッドを削減することで、多くの時間を節約できます。



    1. Meteorアプリ—デプロイされたアプリのDBをリセットします

    2. サブドキュメントの配列にあるフィールドのインデックス作成

    3. 純粋なRedisを使用して、パターンに一致する数百万のキーをアトミックに削除するにはどうすればよいですか?

    4. redisが実行されているかどうかを確認します->ノードjs