sql >> Database >  >> NoSQL >> MongoDB

Werk het MongoDB-veld bij met de waarde van een ander veld

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


  1. Kan redis mysql volledig vervangen?

  2. Python-database programmeren met MongoDB voor beginners

  3. Hoe SCAN te gebruiken met de MATCH-optie in Predis

  4. Express Node.JS - Redis-callback ontvangen, beloften uitvoeren