Ab Mongo 4.2 , db.collection.update() kann eine Aggregationspipeline akzeptieren und schließlich die Aktualisierung eines Felds basierend auf seinem eigenen Wert ermöglichen; Dadurch werden ineffiziente Find/Foreach-Muster vermieden.
Außerdem haben Sie sich den $inc angesehen Operator, um einen Tag hinzuzufügen, aber jetzt, da wir eine Aggregationspipeline als Update verwenden können, ist der $add Operator kann verwendet werden:
// { "date" : ISODate("2020-04-05T07:14:17.802Z"), "x" : "y" }
db.collection.updateMany(
{ date : { $exists : true } },
[{ $set: { date: { $add: ["$date", 24*60*60000] } } }]
)
// { "date" : ISODate("2020-04-06T07:14:17.802Z"), "x" : "y" }
-
Der erste Teil
{ date : { $exists : true } }ist die Übereinstimmungsabfrage, die filtert, welche Dokumente aktualisiert werden sollen (in unserem Fall alle Dokumente mit demdateFeld). -
Der zweite Teil
[{ $set: { date: { $add: ["$date", 24*60*60000] } } }]ist die Aktualisierungsaggregationspipeline (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline anzeigen).$setist ein neuer Aggregationsoperator und ein Alias von$addFields. Dann kann jeder Aggregationsoperator innerhalb des$setverwendet werden Bühne; in unserem Fall ein einfaches$addzwischen dem vorhandenen Datum und der Darstellung eines Tages in Millisekunden.