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

MongoDB:同じドキュメント内の別の配列に配列をコピーする

    比較的小さいデータの場合、 snapshot カーソルの forEach() 方法と各ドキュメントの更新は次のとおりです。

    db.wholesalers.find({ 
        "brands": { "$exists": true, "$type": 4 } 
    }).snapshot().forEach(function(doc){ 
        db.wholesalers.updateOne(
            { "_id": doc._id },
            { "$set": { "brandsNetherlands": doc.brands } }
        );
    });
    

    これは小さなコレクションには最適ですが、大きなデータセットをループし、リクエストごとにサーバーに各更新操作を送信すると計算上のペナルティが発生するため、大きなコレクションのパフォーマンスは大幅に低下します。

    Bulk() APIが助けになり、書き込み操作がサーバーに一括で1回だけ送信されるため、パフォーマンスが大幅に向上します。メソッドがすべての書き込みリクエストをサーバーに送信しないため、効率が向上します( forEach() ループ)が、1000リクエストごとに1回だけであるため、更新が現在よりも効率的かつ迅速になります。

    上記と同じ概念を forEach() ループしてバッチを作成すると、次のようにコレクションを一括で更新できます。

    このデモでは、 Bulk() MongoDBバージョン>= 2.6 and < 3.2で利用可能なAPI initializeUnorderedBulkOp() 並列に、および非決定論的な順序で、バッチでの書き込み操作を実行するメソッド:

    var Bulk =db.wholesalers.initializeUnorderedBulkOp()、counter =0; //バッチ更新サイズを追跡するためのカウンター

    db.wholesalers.find({ 
        "brands": { "$exists": true, "$type": 4 } 
    }).snapshot().forEach(function(doc){ 
    
        bulk.find({ "_id": doc._id }).updateOne({ 
            "$set": { "brandsNetherlands": doc.brands } 
        });
    
        counter++; // increment counter
        if (counter % 1000 == 0) {
            bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
            bulk = db.wholesalers.initializeUnorderedBulkOp();
        }
    });
    

    次の例は、新しいMongoDBバージョン3.2に適用されます その後、 Bulk()は非推奨になりました。 APIと、 bulkWrite()

    上記と同じカーソルを使用しますが、同じ forEach() 各一括書き込みドキュメントを配列にプッシュするカーソルメソッド。書き込みコマンドは1000を超える操作を受け入れることができないため、最大で1000の操作を持つように操作をグループ化し、ループが1000の反復に達したときに配列を再初期化する必要があります。

    var cursor = db.wholesalers.find({
             "brands": { "$exists": true, "$type": 4 } 
        }),
        bulkUpdateOps = [];
    
    cursor.snapshot().forEach(function(doc){ 
        bulkUpdateOps.push({ 
            "updateOne": {
                "filter": { "_id": doc._id },
                "update": { "$set": { "brandsNetherlands": doc.brands } }
             }
        });
    
        if (bulkUpdateOps.length === 1000) {
            db.wholesalers.bulkWrite(bulkUpdateOps);
            bulkUpdateOps = [];
        }
    });         
    
    if (bulkUpdateOps.length > 0) { db.wholesalers.bulkWrite(bulkUpdateOps); }
    



    1. 2つの列を互いに一意にすることはできますか?または、redisで複合主キーを使用しますか?

    2. MongoDBelemMatchサブドキュメント

    3. SpringDataRESTアプリケーションがRedisキャッシングを実装した後にデータベースからデータを取得しない

    4. PHPオブジェクトをMONGODBに挿入する