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