Det bästa sättet att göra detta är i version 4.2+ som tillåter användning av aggregeringspipeline i uppdateringen dokumentet och updateOne , updateMany eller update insamlingsmetoder. Notera att det senare har utfasat i de flesta om inte alla språk drivrutiner.
MongoDB 4.2+
Version 4.2 introducerade också $set pipeline stage operator som är ett alias för $addFields . Jag kommer att använda $set här som det kartor med det vi försöker uppnå.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
Observera att hakparenteser i det andra argumentet till metoden som definierar en aggregeringspipeline istället för ett vanligt uppdateringsdokument. Att använda ett vanligt dokument inte fungerar korrekt.
MongoDB 3.4+
I 3.4+ kan du använda $addFields och $out aggregeringspipelineoperatörer.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Observera att detta inte uppdaterar din samling utan istället ersätter den befintliga samlingen eller skapar en ny. Även för uppdateringsoperationer som kräver "typecasting" behöver du bearbetning på klientsidan, och beroende på operationen kan du behöva använda find() metoden istället för .aggreate() metod.
MongoDB 3.2 och 3.0
Sättet vi gör detta på är genom $project använda våra dokument och använda $concat strängaggregationsoperator för att returnera den sammanlänkade strängen. Därifrån itererar du sedan markören och använd $set uppdatera operatorn för att lägga till det nya fältet i dina dokument med bulkoperationer för maximal effektivitet.
Aggregationsfråga:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 eller senare
från detta måste du använda bulkWrite metod.
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);
}
MongoDB 2.6 och 3.0
Från den här versionen måste du använda den nu utfasade Bulk API och dess associerade metoder.
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 } }
);
})