Der beste Weg , dies zu tun , ist in der Version 4.2 und höher , die in dem Update - Dokument mit der Aggregation Pipeline ermöglicht und das updateOne, updateManyoder updateSammelverfahren. Beachten Sie, dass Letzteres in den meisten, wenn nicht allen Sprachtreibern veraltet ist.
MongoDB 4.2+
In Version 4.2 wurde auch der $setPipeline-Stage-Operator eingeführt, der ein Alias für ist $addFields. Ich verwende $sethier , wie es Karten mit dem, was wir zu erreichen versuchen.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
MongoDB 3.4+
In Version 3.4+ können Sie $addFieldsdie $outAggregationspipeline-Operatoren verwenden.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Beachten Sie, dass dadurch Ihre Sammlung nicht aktualisiert wird, sondern die vorhandene Sammlung ersetzt oder eine neue erstellt wird. Auch für Aktualisierungsvorgänge, die "Typumwandlung" erfordern, benötigen Sie eine clientseitige Verarbeitung. Je nach Vorgang müssen Sie möglicherweise die find()Methode anstelle der .aggreate()Methode verwenden.
MongoDB 3.2 und 3.0
Dazu verwenden wir $projectunsere Dokumente und verwenden den $concatZeichenfolgenaggregationsoperator, um die verkettete Zeichenfolge zurückzugeben. Von dort aus iterieren Sie dann den Cursor und verwenden den $setAktualisierungsoperator, um das neue Feld mithilfe von Massenoperationen zu Ihren Dokumenten hinzuzufügen, um maximale Effizienz zu erzielen.
Aggregationsabfrage:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 oder neuer
Aus diesem Grund müssen Sie die bulkWriteMethode verwenden.
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 und 3.0
Ab dieser Version müssen Sie die jetzt veraltete BulkAPI und die zugehörigen Methoden verwenden .
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 } }
);
})