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

Mongoは、単一のクエリで一致するドキュメントフィールドを一括検索して更新しますか?

    パフォーマンスを向上させるには、 Bulk()を使用してください。 バッチでサーバーに操作を送信するため、コレクションを効率的に一括更新するためのAPI(たとえば、バッチサイズ500)。これにより、すべてのリクエストをサーバーに送信するのではなく、500リクエストごとに1回だけ送信するため、パフォーマンスが大幅に向上し、更新がより効率的かつ迅速になります。

    以下はこのアプローチを示しています。最初の例ではBulk()を使用しています。 MongoDBバージョン>=2.6および<3.2で利用可能なAPI。表示されたフィールドに1をインクリメントすることにより、コレクション内の一致したすべてのドキュメントを特定の配列から更新します。画像の配列が構造を持っていることを前提としています

    var images = [
        { "_id": 1, "name": "img_1.png" },
        { "_id": 2, "name": "img_2.png" }
        { "_id": 3, "name": "img_3.png" },
        ...
        { "_id": n, "name": "img_n.png" }
    ]
    

    MongoDBバージョン>=2.6および<3.2

    var bulk = db.images.initializeUnorderedBulkOp(),
        counter = 0;
    
    images.forEach(function (doc) {    
        bulk.find({ "_id": doc._id }).updateOne({ 
            "$inc": { "shown": 1 }
        });
    
        counter++;
        if (counter % 500 === 0) {
            // Execute per 500 operations
            bulk.execute(); 
            // re-initialize every 500 update statements
            bulk = db.images.initializeUnorderedBulkOp();
        }
    })
    // Clean up remaining queue
    if (counter % 500 !== 0) { bulk.execute(); }
    

    次の例は、 Bulk()が廃止された新しいMongoDBバージョン3.2に適用されます。 APIを使用し、 bulkWrite()を使用して新しいAPIセットを提供しました

    MongoDBバージョン3.2以降

    var ops = [];
    images.forEach(function(doc) {
        ops.push({
            "updateOne": {
                "filter": { "_id": doc._id },
                "update": {
                    "$inc": { "shown": 1 }
                }
            }
        });
    
        if (ops.length === 500 ) {
            db.images.bulkWrite(ops);
            ops = [];
        }
    })
    
    if (ops.length > 0)  
        db.images.bulkWrite(ops);
    



    1. Hadoop Map/Reduceと組み込みのMap/Reduce

    2. $ unionWith –MongoDBのUNIONALLに相当

    3. MongoDBを使用した単体テスト

    4. MongoDbで15分の時間間隔で結果をグループ化します