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 demdate
Feld). -
Der zweite Teil
[{ $set: { date: { $add: ["$date", 24*60*60000] } } }]
ist die Aktualisierungsaggregationspipeline (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline anzeigen).$set
ist ein neuer Aggregationsoperator und ein Alias von$addFields
. Dann kann jeder Aggregationsoperator innerhalb des$set
verwendet werden Bühne; in unserem Fall ein einfaches$add
zwischen dem vorhandenen Datum und der Darstellung eines Tages in Millisekunden.