Der beste Weg, dies zu tun, ist in Version 4.2+, die die Verwendung der Aggregationspipeline im Update ermöglicht document und das updateOne
, updateMany
oder update
Erhebungsmethoden. Beachten Sie, dass letzteres in den meisten, wenn nicht allen Sprachtreibern veraltet ist.
MongoDB 4.2+
Version 4.2 führte auch den $set
ein Pipeline-Stage-Operator, der ein Alias für $addFields
ist . Ich werde $set
verwenden hier wie es abbildet mit dem, was wir erreichen wollen.
db.collection.<update method>(
{},
[
{"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
]
)
Beachten Sie die eckigen Klammern im zweiten Argument der Methode, die anstelle eines einfachen Aktualisierungsdokuments eine Aggregationspipeline definiert. Die Verwendung eines einfachen Dokuments wird nicht richtig funktionieren.
MongoDB 3.4+
In 3.4+ können Sie $addFields
verwenden und der $out
Betreiber von Aggregationspipelines.
db.collection.aggregate(
[
{ "$addFields": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}},
{ "$out": "collection" }
]
)
Beachten Sie, dass dies Ihre Sammlung nicht aktualisiert, sondern stattdessen die vorhandene Sammlung ersetzt oder eine neue erstellt. Auch für Aktualisierungsvorgänge, die eine "Typumwandlung" erfordern, benötigen Sie eine clientseitige Verarbeitung und abhängig von der Operation müssen Sie möglicherweise find()
verwenden -Methode anstelle von .aggreate()
Methode.
MongoDB 3.2 und 3.0
Wir machen das mit $project
unsere Dokumente zu kopieren und den $concat
zu verwenden String-Aggregationsoperator, um den verketteten String zurückzugeben. Von dort iterieren Sie dann den Cursor und verwenden Sie den $set
Update-Operator, um das neue Feld mithilfe von Massenvorgängen zu Ihren Dokumenten hinzuzufügen für maximale Effizienz.
Aggregationsabfrage:
var cursor = db.collection.aggregate([
{ "$project": {
"name": { "$concat": [ "$firstName", " ", "$lastName" ] }
}}
])
MongoDB 3.2 oder neuer
von diesem müssen Sie den bulkWrite
verwenden 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 und 3.0
Ab dieser Version müssen Sie den inzwischen veralteten Bulk
verwenden API und die zugehörigen 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 } }
);
})