MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Преоформете документи чрез разделяне на стойност на поле

Оптималният начин в MongoDB версия 3.4.

Тази версия на mongod предоставя $split оператор, който, разбира се, разделя низа, както е показано тук .

След това присвояваме новоизчислената стойност на променлива с помощта на $нека променлив оператор. След това новата стойност може да се използва в in израз за връщане на стойностите „име“ и „възраст“ с помощта на $arrayElemAt оператор за връщане на елемента при определен индекс; 0 за първия елемент и -1 за последния елемент.

Имайте предвид, че вв израз трябва да разделим последния елемент, за да върнем низа от цяло число.

Накрая трябва да повторим курсора обект и преобразувайте преобразуването на низа от цяло число в числово, като използвате Число или parseInt и използвайте групова операция и bulkWrite() метод за $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);
}

MongoDB 3.2 или по-нова версия.

MongoDB 3.2 отхвърля стария Bulk() API и свързаните с него методи и предоставя bulkWrite() метод, но не предоставя $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.

Трябва да използваме вече остарелия Bulk API .

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Не може да презапише модела „потребители“ след компилиран възел js

  2. Обобщено групиране по дата с отместване на лятното часово време

  3. mongodb мултитенатично заклинание с @Document

  4. Импорт/експорт на MongoDB с помощта на Node.js

  5. Съхраняване на йерархия на директории в хранилище на данни ключ-стойност