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
, updateMany
oder update
Sammelverfahren. Beachten Sie, dass Letzteres in den meisten, wenn nicht allen Sprachtreibern veraltet ist.
MongoDB 4.2+
In Version 4.2 wurde auch der $set
Pipeline-Stage-Operator eingeführt, der ein Alias für ist $addFields
. Ich verwende $set
hier , 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 $addFields
die $out
Aggregationspipeline-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 $project
unsere Dokumente und verwenden den $concat
Zeichenfolgenaggregationsoperator, um die verkettete Zeichenfolge zurückzugeben. Von dort aus iterieren Sie dann den Cursor und verwenden den $set
Aktualisierungsoperator, 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 bulkWrite
Methode 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 Bulk
API 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 } }
);
})