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

これは、mongodbにオブジェクトの配列を挿入および更新するための安全な方法ですか?

    bullkWrite 更新を実行するためのAPIは、これをより適切に処理します

    mongodb.connect(mongo_url, function(err, db) {
        if(err) console.log(err)
        else {
            var mongo_products_collection = db.collection("products")
    
            mongoUpsert(mongo_products_collection, data_products, function() {
                db.close()
            })
        }
    })
    
    function mongoUpsert(collection, data_array, cb) {
    
        var bulkUpdateOps = data_array.map(function(data) {
            return {
                "updateOne": {
                    "filter": { 
                        "product_id": data.product_id,
                        "post_modified": { "$ne": data.post_modified }
                    },
                    "update": { "$set": data },
                    "upsert": true
                }
            };
        });
    
        collection.bulkWrite(bulkUpdateOps, function(err, r) {
            // do something with result
        });
    
        return cb(false);
    }
    

    より大きな配列、つまり1000を超える配列を処理している場合は、書き込みを500のバッチでサーバーに送信することを検討してください。これにより、サーバーにすべての要求を送信するのではなく、500の要求ごとに1回だけ、パフォーマンスが向上します。

    一括操作の場合、MongoDBはデフォルトの内部制限を課します バッチあたり1000の操作であるため、MongoDBにデフォルトを課すのではなく、バッチサイズをある程度制御できるという意味で、500のドキュメントを選択することをお勧めします。つまり、1000を超えるドキュメントの規模の大規模な操作の場合です。したがって、最初のアプローチの上記の場合、これは小さいので一度にすべてのアレイを書き込むことができますが、500の選択肢はより大きなアレイ用です。

    var ops = [],
        counter = 0;
    
    data_array.forEach(function(data) {
        ops.push({
            "updateOne": {
                "filter": { 
                    "product_id": data.product_id, 
                    "post_modified": { "$ne": data.post_modified } 
                },
                "update": { "$set": data },
                "upsert": true
            }
        });
        counter++;
    
        if (counter % 500 == 0) {
            collection.bulkWrite(ops, function(err, r) {
                // do something with result
            });
            ops = [];
        }
    })
    
    if (counter % 500 != 0) {
        collection.bulkWrite(ops, function(err, r) {
            // do something with result
        }
    }
    



    1. MongoDB $ second

    2. ネストされたサブドキュメントmongodbの配列でフィールドを検索する方法は?

    3. mongoDBでhh:mmからhh:mmまでの2回のデータをフィルタリングする方法

    4. mongodbのEmbeddedArraysVSフラットドキュメントの長所と短所は何でしょうか?