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

マングースマルチアップデート

    のような一致するIDでコレクション内に更新したいオブジェクトの配列があるとします。
    var soldItems = [
            {
                "_id": 1,
                "value": 4
            },
            {
                "_id": 2,
                "value": 27
            }
        ];
    

    次に、 <を使用できます。 code> forEach() 配列を反復処理してコレクションを更新するためのメソッド:

    soldItems.forEach(function(item)){
        Model.update({"_id": item._id}, {"$set": {"value": item.value }}, callback);
    });
    

    または、promiseを次のように使用します

    var updates = [];
    soldItems.forEach(function(item)){
        var updatePromise = Model.update({"_id": item._id}, {"$set": {"value": item.value }});
        updates.push(updatePromise);
    });
    
    Promise.all(updates).then(function(results){
        console.log(results);
    });
    

    またはmapを使用します()

    var updates = soldItems.map(function(item)){
        return Model.update({"_id": item._id}, {"$set": {"value": item.value }});       
    });
    
    Promise.all(updates).then(function(results){
        console.log(results);
    }); 
    

    大規模なアレイの場合は、一括書き込みAPIを使用してパフォーマンスを向上させることができます。 Mongooseバージョンの場合>=4.3.0 MongoDB Server 3.2.xをサポートします 、 <を使用できます。 code> bullkWrite() 更新のため。次の例は、これを実行する方法を示しています。

    var bulkUpdateCallback = function(err, r){
        console.log(r.matchedCount);
        console.log(r.modifiedCount);
    }
    // Initialise the bulk operations array
    var bulkOps = soldItems.map(function (item) { 
        return { 
            "updateOne": { 
                "filter": { "_id": item._id } ,              
                "update": { "$set": { "value": item.value } } 
            }         
        }    
    });
    
    // Get the underlying collection via the native node.js driver collection object
    Model.collection.bulkWrite(bulkOps, { "ordered": true, w: 1 }, bulkUpdateCallback);
    

    Mongooseバージョンの場合〜3.8.8、〜3.8.22、4.x MongoDBサーバーをサポートする>=2.6.x Bulk APIを使用できます 次のように

    var bulk = Model.collection.initializeOrderedBulkOp(),
        counter = 0;
    
    soldItems.forEach(function(item) {
        bulk.find({ "_id": item._id }).updateOne({ 
            "$set": { "value": item.value }
        });
    
        counter++;
        if (counter % 500 == 0) {
            bulk.execute(function(err, r) {
               // do something with the result
               bulk = Model.collection.initializeOrderedBulkOp();
               counter = 0;
            });
        }
    });
    
    // Catch any docs in the queue under or over the 500's
    if (counter > 0) {
        bulk.execute(function(err,result) {
           // do something with the result here
        });
    }
    


    1. MongoDB HostName/URI構成

    2. ハウツー:MapReduceでリージョン固有のキー範囲を使用してソルトされたApacheHBaseテーブルをスキャンする

    3. MongoAlchemyクエリ埋め込みドキュメント

    4. MongoDBのIDに基づいて複数のコレクションからドキュメントを削除するにはどうすればよいですか?