Börjar i Mongo 4.2
, db.collection.update()
kan acceptera en aggregeringspipeline, vilket slutligen tillåter uppdatering av ett fält baserat på dess eget värde; på så sätt undviker ineffektiva hitta-/före-mönster.
Du tittade också på $inc
operatör för att lägga till en dag, men nu när vi kan använda en aggregeringspipeline som en uppdatering, $add
operator kan användas:
// { "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" }
-
Den första delen
{ date : { $exists : true } }
är matchningsfrågan som filtrerar vilka dokument som ska uppdateras (i vårt fall har alla dokumentdate
fält). -
Den andra delen
[{ $set: { date: { $add: ["$date", 24*60*60000] } } }]
är uppdateringsaggregationspipelinen (observera att hakparenteserna anger användningen av en aggregationspipeline).$set
är en ny aggregeringsoperator och ett alias för$addFields
. Då kan vilken aggregeringsoperator som helst användas inom$set
skede; i vårt fall en enkel$add
mellan det befintliga datumet och representationen av en dag i millisekunder.