Оптималният начин в 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();
}