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

MongoDBの多数のドキュメントを最も効率的に更新するにはどうすればよいですか?

    MongoDBサーバーが2.6以降の場合は、書き込みコマンドを使用することをお勧めします バルクAPI 一括実行を可能にするupdate 一括操作を簡単に構築できるようにするための、サーバー上での単なる抽象化である操作。これらの一括操作には、主に2つの種類があります。

    • 注文された一括操作 。これらの操作はすべての操作を順番に実行し、最初の書き込みエラーでエラーになります。
    • 順序付けられていない一括操作 。これらの操作は、すべての操作を並行して実行し、すべてのエラーを集約します。順序付けされていない一括操作は、実行の順序を保証するものではありません。

    2.6より古いサーバーの場合、APIは操作をダウンコンバートすることに注意してください。ただし、100%ダウンコンバートすることはできないため、正しい数値を正しく報告できないエッジケースが発生する可能性があります。

    3つの一般的なユースケースでは、次のようにBulkAPIを実装できます。

    ケース1。 値を変更せずに、プロパティの値のタイプを変更します:

    var MongoClient = require('mongodb').MongoClient;
    
    MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
        // Handle error
        if(err) throw err;
    
        // Get the collection and bulk api artefacts
        var col = db.collection('users'),           
            bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
            counter = 0;        
    
        // Case 1. Change type of value of property, without changing the value.        
        col.find({"timestamp": {"$exists": true, "$type": 2} }).each(function (err, doc) {
    
            var newTimestamp = parseInt(doc.timestamp);
            bulk.find({ "_id": doc._id }).updateOne({
                "$set": { "timestamp": newTimestamp }
            });
    
            counter++;
    
            if (counter % 1000 == 0 ) {
                bulk.execute(function(err, result) {  
                    // re-initialise batch operation           
                    bulk = col.initializeOrderedBulkOp();
                });
            }
        });
    
        if (counter % 1000 != 0 ){
            bulk.execute(function(err, result) {
                // do something with result
                db.close();
            }); 
        } 
    });
    

    ケース2。 既存のプロパティの値に基づいて新しいプロパティを追加します:

    MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
        // Handle error
        if(err) throw err;
    
        // Get the collection and bulk api artefacts
        var col = db.collection('users'),           
            bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
            counter = 0;        
    
        // Case 2. Add new property based on value of existing property.        
        col.find({"name": {"$exists": false } }).each(function (err, doc) {
    
            var fullName = doc.firstname + " " doc.lastname;
            bulk.find({ "_id": doc._id }).updateOne({
                "$set": { "name": fullName }
            });
    
            counter++;
    
            if (counter % 1000 == 0 ) {
                bulk.execute(function(err, result) {  
                    // re-initialise batch operation           
                    bulk = col.initializeOrderedBulkOp();
                });
            }
        });
    
        if (counter % 1000 != 0 ){
            bulk.execute(function(err, result) {
                // do something with result
                db.close();
            }); 
        } 
    });
    

    ケース3。 ドキュメントからプロパティを削除するだけです。

    MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
        // Handle error
        if(err) throw err;
    
        // Get the collection and bulk api artefacts
        var col = db.collection('users'),           
            bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
            counter = 0;        
    
        // Case 3. Simply adding removing properties from documents.    
        col.find({"street_no": {"$exists": true } }).each(function (err, doc) {
    
            bulk.find({ "_id": doc._id }).updateOne({
                "$set": { "no": doc.street_no },
                "$unset": { "street_no": "" }
            });
    
            counter++;
    
            if (counter % 1000 == 0 ) {
                bulk.execute(function(err, result) {  
                    // re-initialise batch operation           
                    bulk = col.initializeOrderedBulkOp();
                });
            }
        });
    
        if (counter % 1000 != 0 ){
            bulk.execute(function(err, result) {
                // do something with result
                db.close();
            }); 
        } 
    });
    



    1. MongoDBでネストされた$lookup検索を行う方法は?

    2. DjangoはmongoDBアトラスに接続できません

    3. ヨーマン、マングース、およびMongoDBスキャフォールディング

    4. マングースfindOneAndUpdate:オブジェクトの配列内のオブジェクトを更新します