Det optimala sättet i MongoDB version 3.4.
Denna version av mongod
tillhandahåller $split
operatör som naturligtvis delar upp strängen som visas här
.
Vi tilldelar sedan det nyligen beräknade värdet till en variabel med $let
variabel operator. Det nya värdet kan sedan användas i in uttryck för att returnera värdena "namn" och "ålder" med hjälp av 0
för det första elementet och -1
för det sista elementet.
Observera att i in uttryck måste vi dela upp det sista elementet för att returnera strängen med heltal.
Slutligen måste vi iterera Markören
objekt och cast konvertera strängen av heltal till numerisk med Nummer
eller parseInt
och använd bulkoperation och bulkWrite()
metod för att $set
värdet för dessa fält för maximal effektivitet.
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 eller senare.
MongoDB 3.2 fasar ut den gamla Bulk()
API och dess associerade metoder
och tillhandahåller bulkWrite()
metoden men den tillhandahåller inte $split
så det enda alternativet vi har här är att använda
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 version 2.6 eller 3.0.
Vi måste använda det nu utfasade 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();
}