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

フィールド値を分割してドキュメントの形状を変更する

    MongoDBバージョン3.4での最適な方法。

    このバージョンのmongod $ splitを提供します もちろん、ここ に示すように文字列を分割する演算子 。

    次に、 を使用して、新しく計算された値を変数に割り当てます。 $ let 変数演算子。その後、新しい値を inで使用できます $ arrayElemAt 指定されたインデックスの要素を返す演算子。 0 最初の要素と-1 最後の要素。

    inに注意してください 式整数の文字列を返すには、最後の要素を分割する必要があります。

    最後に、 Cursorを繰り返す必要があります オブジェクトをキャストし、番号 または parseInt 一括操作と bullkWrite() $ setへのメソッド 効率を最大化するためのこれらのフィールドの値。

    let requests = [];
    db.coll.aggregate(
        [
            { "$project": {  
                "person": { 
                    "$let": { 
                        "vars": { 
                            "infos":  { "$split": [ "$person", "," ] } 
                        }, 
                        "in": { 
                            "name": { "$arrayElemAt": [ "$$infos", 0 ] }, 
                            "age": { 
                                "$arrayElemAt": [ 
                                    { "$split": [ 
                                        { "$arrayElemAt": [ "$$infos", -1 ] }, 
                                        " " 
                                    ]}, 
                                    -1 
                                ] 
                            } 
                        } 
                    } 
                }  
            }}
        ] 
    ).forEach(document => { 
        requests.push({ 
            "updateOne": { 
                "filter": { "_id": document._id }, 
                "update": { 
                    "$set": { 
                        "name": document.person.name, 
                        "age": Number(document.person.age) 
                    },
                    "$unset": { "person": " " }
                } 
            } 
        }); 
        if ( requests.length === 500 ) { 
            // Execute per 500 ops and re-init
            db.coll.bulkWrite(requests); 
            requests = []; 
        }} 
    );
    
     // Clean up queues
    if(requests.length > 0) {
        db.coll.bulkWrite(requests);
    }
    

    MongoDB3.2以降。

    MongoDB 3.2は、古い Bulk()を廃止します APIとそれに関連するメソッド bullkWrite()を提供します メソッドですが、 $ splitは提供されません 演算子なので、ここでの唯一のオプションは、 mapReduce() データを変換してから、一括操作を使用してコレクションを更新する方法。

    var mapFunction = function() { 
        var person = {}, 
        infos = this.person.split(/[,\s]+/); 
        person["name"] = infos[0]; 
        person["age"] = infos[2]; 
        emit(this._id, person); 
    };
    
    var results = db.coll.mapReduce(
        mapFunction, 
        function(key, val) {}, 
        { "out": { "inline": 1 } }
    )["results"];
    
    results.forEach(document => { 
        requests.push({ 
            "updateOne": { 
                "filter": { "_id": document._id }, 
                "update": { 
                    "$set": { 
                        "name": document.value.name, 
                        "age": Number(document.value.age) 
                    }, 
                    "$unset": { "person": " " }
                } 
            } 
        }); 
        if ( requests.length === 500 ) { 
            // Execute per 500 operations and re-init
            db.coll.bulkWrite(requests); 
            requests = []; 
        }} 
    );
    
    // Clean up queues
    if(requests.length > 0) {
        db.coll.bulkWrite(requests);
    }
    

    MongoDBバージョン2.6または3.0。

    非推奨となった BulkAPI を使用する必要があります 。

    var bulkOp = db.coll.initializeUnorderedBulkOp();
    var count = 0;
    
    results.forEach(function(document) { 
        bulkOp.find({ "_id": document._id}).updateOne(
            { 
                "$set": { 
                    "name": document.value.name, 
                    "age": Number(document.value.age)
                },
                "$unset": { "person": " " }
            }
        );
        count++;
        if (count === 500 ) {
            // Execute per 500 operations and re-init
            bulkOp.execute();
            bulkOp = db.coll.initializeUnorderedBulkOp();
        }
    });
    
    // clean up queues
    if (count > 0 ) {
        bulkOp.execute();
    }
    



    1. Mongodbアグリゲーション$group、配列の長さを制限

    2. Mongooseのインスタンスメソッドで他のモデルを検索できますか?

    3. Dockerコンテナが稼働するのをどのように待つことができますか?

    4. long型のプロパティにBsonIgnoreIfDefaultを使用できません