MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisieren Sie das MongoDB-Feld mit dem Wert eines anderen Felds

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 } }
    );
})