A partire da Mongo 4.2 , db.collection.update() può accettare una pipeline di aggregazione, consentendo infine l'aggiornamento di un campo in base al proprio valore; evitando così schemi di ricerca/foreach inefficienti.
Inoltre, stavi guardando il $inc operatore per aggiungere un giorno, ma ora che possiamo utilizzare una pipeline di aggregazione come aggiornamento, il $add operatore può essere utilizzato:
// { "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" }
-
La prima parte
{ date : { $exists : true } }è la query di corrispondenza, che filtra quali documenti aggiornare (nel nostro caso tutti i documenti che hanno ladatecampo). -
La seconda parte
[{ $set: { date: { $add: ["$date", 24*60*60000] } } }]è la pipeline di aggregazione degli aggiornamenti (notare le parentesi quadre che indicano l'uso di una pipeline di aggregazione).$setè un nuovo operatore di aggregazione e un alias di$addFields. Quindi qualsiasi operatore di aggregazione può essere utilizzato all'interno di$setfase; nel nostro caso un semplice$addizione tra la data esistente e la rappresentazione di un giorno in millisecondi.