De beste manier om dit te doen is in versie 4.2+ die het gebruik van aggregatiepijplijn in de update mogelijk maakt document en de updateOne
, updateMany
of update
collectie methoden. Merk op dat de laatste in de meeste, zo niet alle taalstuurprogramma's is verouderd.
MongoDB 4.2+
Versie 4.2 introduceerde ook de $set
pijplijnfase-operator die een alias is voor $addFields
. Ik gebruik $set
hier zoals het kaarten met wat we proberen te bereiken.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
Merk op dat vierkante haken in het tweede argument voor de methode die een aggregatiepijplijn definieert in plaats van een gewoon updatedocument. Het gebruik van een gewoon document zal niet correct werken.
MongoDB 3.4+
In 3.4+ kun je $addFields
. gebruiken en de $out
aggregatie pijpleiding operators.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Houd er rekening mee dat dit je verzameling niet bijwerkt, maar in plaats daarvan de bestaande verzameling vervangt of een nieuwe maakt. Ook voor updatebewerkingen waarvoor "typecasting" nodig is, hebt u verwerking aan de clientzijde nodig, en afhankelijk van de bewerking, moet u mogelijk de find()
. gebruiken methode in plaats van de .aggreate()
methode.
MongoDB 3.2 en 3.0
De manier waarop we dit doen is door $project
onze documenten en het gebruik van de $concat
tekenreeksaggregatie-operator om de aaneengeschakelde tekenreeks te retourneren. Van daaruit herhaalt u de cursor en gebruik de $set
update-operator om het nieuwe veld aan uw documenten toe te voegen met behulp van bulkbewerkingen voor maximale efficiëntie.
Aggregatiequery:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 of nieuwer
hiervan moet u de bulkWrite
. gebruiken methode.
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 en 3.0
Vanaf deze versie moet je de nu verouderde Bulk
. gebruiken API en de bijbehorende methoden.
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 } }
);
})