sql >> Database >  >> NoSQL >> MongoDB

Een veld bijwerken met de vorige waarde in MongoDB/Mongoose

U kunt niet verwijzen naar de waarden van het document dat u wilt bijwerken, dus u hebt één query nodig om het document op te halen en een andere om het bij te werken. Het lijkt erop dat er een functieverzoek is daarvoor in OPEN staat sinds 2016.

Als u een verzameling heeft met documenten die er als volgt uitzien:

{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name" : "bar" }

Met de MongoDB-shell kun je zoiets als dit doen:

db.test.find({ name: "bar" }).snapshot().forEach((doc) => {
    doc.name = "foo-" + doc.name;

    db.test.save(doc);
});

Het document wordt zoals verwacht bijgewerkt:

{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name": "foo-bar" }

Let op de .snapshot() call.Dit zorgt ervoor dat de query een document niet meerdere keren retourneert omdat een tussenliggende schrijfbewerking het verplaatst vanwege de groei in documentgrootte.

Dit toepassen op uw Mongoose-voorbeeld, zoals uitgelegd in dit officiële voorbeeld :

Cat.findById(1, (err, cat) => {
    if (err) return handleError(err);

    cat.name = cat.name + "bar";

    cat.save((err, updatedCat) => {
        if (err) return handleError(err);

        ...
    });
});

Het is vermeldenswaard dat er een $concat is operator in het aggregatieraamwerk, maar helaas kun je dat niet gebruiken in een update vraag.

Hoe dan ook, afhankelijk van wat je moet doen, kun je dat gebruiken samen met de $out operator om de resultaten van de aggregatie op te slaan in een nieuwe verzameling.

Met datzelfde voorbeeld doet u:

db.test.aggregate([{
    $match: { name: "bar" }
}, {
    $project: { name: { $concat: ["foo", "-", "$name"] }}
}, {
    $out: "prefixedTest"
}]);

En een nieuwe verzameling prefixedTest worden gemaakt met documenten die er als volgt uitzien:

{ "_id" : ObjectId("XXX"), "name": "foo-bar" }

Ter referentie, er is nog een interessante vraag over hetzelfde onderwerp met een paar antwoorden die het lezen waard zijn:MongoDB-veld bijwerken met de waarde van een ander veld



  1. een collectie hernoemen met mongoDB

  2. telling van $opzoekresultaat mongodb

  3. Kan bleekselderij een Database Scheduler gebruiken zonder Django?

  4. Dubbele documenten op _id (in mongo)