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

Mongoは埋め込みドキュメントを配列に変換します

    コンテンツを繰り返す必要がありますが、代わりに一括操作を使用して書き戻す必要があります:

    MongoDB 2.6以降のいずれか:

    var bulk = db.collection.initializeUnorderedBulkOp(),
        count = 0;
    
    db.collection.find({ 
       "$where": "return !Array.isArray(this.experience)"
    }).forEach(function(doc) {
        bulk.find({ "_id": doc._id }).updateOne({
            "$set": { "experience": [doc.experience["0"]] }
        });
        count++;
    
        // Write once in 1000 entries
        if ( count % 1000 == 0 ) {
            bulk.execute();    
            bulk = db.collection.initializeUnorderedBulkOp();
        }
    })
    
    // Write the remaining
    if ( count % 1000 != 0 )
        bulk.execute();
    

    または、MongoDB 3.2以降の最新リリースでは、bulkWrite() 方法をお勧めします:

    var ops = [];
    
    db.collection.find({ 
       "$where": "return !Array.isArray(this.experience)"
    }).forEach(function(doc) {
       ops.push({
           "updateOne": {
               "filter": { "_id": doc._id },
               "update": { "$set": { "experience": [doc.experience["0"]] } }
           }
       });
    
       if ( ops.length == 1000 ) {
           db.collection.bulkWrite(ops,{ "ordered": false })
           ops = [];
       }
    })
    
    if ( ops.length > 0 )
        db.collection.bulkWrite(ops,{ "ordered": false });
    

    したがって、カーソルを使用してデータベースに書き戻す場合は、「順序付けされていない」設定を使用した一括書き込み操作が最適です。これは、1000リクエストのバッチごとに1つの書き込み/応答のみであるため、多くのオーバーヘッドが削減されます。「順序なし」とは、書き込みがシリアル順序ではなく並列で発生する可能性があることを意味します。すべてが高速になります。



    1. MongoDB $ sin

    2. RedisはWindows7のWindowsサービスとして起動しません

    3. Mongo更新配列要素(.NETドライバー2.0)

    4. Javaドライバーを使用してmongodbのドキュメントのフィールドを更新するにはどうすればよいですか?