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

別のフィールドの値を使用してMongoDBフィールドを更新します

    これを行うための最良の方法は、バージョン4.2以降であり、 updateで集約パイプラインを使用できます。 ドキュメントとupdateOneupdateMany またはupdate 収集方法。後者は、すべてではないにしてもほとんどの言語ドライバーで非推奨になっていることに注意してください。

    MongoDB 4.2+

    バージョン4.2では、$setも導入されました $addFieldsのエイリアスであるパイプラインステージ演算子 。 $setを使用します ここにマップ 私たちが達成しようとしていることで。

    db.collection.<update method>(
        {},
        [
            {"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
        ]
    )
    

    プレーンな更新ドキュメントの代わりに集計パイプラインを定義するメソッドの2番目の引数の角かっこに注意してください。プレーンドキュメントを使用すると、使用されません 正しく機能します。

    MongoDB 3.4+

    3.4以降では、$addFieldsを使用できます および$out 集約パイプライン演算子。

    db.collection.aggregate(
        [
            { "$addFields": { 
                "name": { "$concat": [ "$firstName", " ", "$lastName" ] } 
            }},
            { "$out": "collection" }
        ]
    )
    

    これはコレクションを更新するのではなく、既存のコレクションを置き換えるか、新しいコレクションを作成することに注意してください。 また、「型キャスト」を必要とする更新操作の場合は、クライアント側の処理が必要になります 操作によっては、find()を使用する必要がある場合があります .aggreate()の代わりにメソッド メソッド。

    MongoDB3.2および3.0

    これを行う方法は、$projectによるものです。 ドキュメントを作成し、$concatを使用します 連結された文字列を返す文字列集計演算子。そこから、カーソルを繰り返します。 $setを使用します 演算子を更新して、一括操作を使用してドキュメントに新しいフィールドを追加します 最大の効率のために。

    集計クエリ:

    var cursor = db.collection.aggregate([ 
        { "$project":  { 
            "name": { "$concat": [ "$firstName", " ", "$lastName" ] } 
        }}
    ])
    

    MongoDB3.2以降

    これから、bulkWriteを使用する必要があります メソッド。

    var requests = [];
    cursor.forEach(document => { 
        requests.push( { 
            'updateOne': {
                'filter': { '_id': document._id },
                'update': { '$set': { 'name': document.name } }
            }
        });
        if (requests.length === 500) {
            //Execute per 500 operations and re-init
            db.collection.bulkWrite(requests);
            requests = [];
        }
    });
    
    if(requests.length > 0) {
         db.collection.bulkWrite(requests);
    }
    

    MongoDB2.6および3.0

    このバージョンから、廃止されたBulkを使用する必要があります APIとそれに関連するメソッド。

    var bulk = db.collection.initializeUnorderedBulkOp();
    var count = 0;
    
    cursor.snapshot().forEach(function(document) { 
        bulk.find({ '_id': document._id }).updateOne( {
            '$set': { 'name': document.name }
        });
        count++;
        if(count%500 === 0) {
            // Excecute per 500 operations and re-init
            bulk.execute();
            bulk = db.collection.initializeUnorderedBulkOp();
        }
    })
    
    // clean up queues
    if(count > 0) {
        bulk.execute();
    }
    

    MongoDB 2.4

    cursor["result"].forEach(function(document) {
        db.collection.update(
            { "_id": document._id }, 
            { "$set": { "name": document.name } }
        );
    })
    


    1. MongoDBドキュメントに含まれる配列に含まれるサブドキュメントを更新します

    2. サーバー側のタイムスタンプをスコアとしてRedisでソートされたセットに保存するにはどうすればよいですか?

    3. SQLで数値をフォーマットする方法

    4. ハッシュ内にリストを保存するRedis