Startar Mongo 4.2
, db.collection.update()
kan acceptera en aggregeringspipeline, vilket slutligen tillåter uppdatering/skapande av ett fält baserat på ett annat fält:
// { a: "Hello", b: "World" }
// { a: "Olleh", b: "Dlrow" }
db.collection.update(
{},
[ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ],
{ multi: true }
)
// { a: "Hello", b: "World", active: true }
// { a: "Olleh", b: "Dlrow", active: false }
-
Den första delen
{}
är matchningsfrågan som filtrerar vilka dokument som ska uppdateras (i vårt fall alla dokument). -
Den andra delen
[ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ]
är uppdateringsaggregationspipeline (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 villkorad likhetskontroll som beror på vilket värde som ska användas för den nyaactive
fältet. -
Glöm inte
{ multi: true }
, annars kommer bara det första matchande dokumentet att uppdateras.