Med MongoDB 4.2 og nyere kan opdateringsmetoden nu tage et dokument eller en samlet pipeline hvor følgende trin kan bruges:
$addFieldsog dets alias$set$projectog dets alias$unset$replaceRootog dets alias$replaceWith.
Bevæbnet med ovenstående vil din opdateringsoperation med den samlede pipeline være at tilsidesætte tags felt ved at sammenkæde et filtreret tags array og et kortlagt array af inputlisten med noget dataopslag i kortet:
Til at starte med bruger det samlede udtryk, der filtrerer tag-arrayet,
const myTags =["arkitektur", "blabladontexist"];{ "$filter":{ "input":"$tags", "cond":{ "$not":[ { "$in ":["$$this.t", myTags] } ] } } } som producerer den filtrerede række af dokumenter
[ { "t" :"moderne", "n" :2 }, { "t" :"kreativ", "n" :1 }, { "t" :"konkret", "n " :3 }]
Nu vil den anden del være at udlede det andet array, der vil blive sammenkædet med ovenstående. Dette array kræver en $map
over myTags input array som
{ "$map":{ "input":myTags, "in":{ "$cond":{ "if":{ "$in":["$$this", "$tags .t"] }, "then":{ "t":"$$this", "n":{ "$sum":[ { "$arrayElemAt":[ "$tags.n", { "$indexOfArray ":[ "$tags.t", "$$this" ] } ] }, 1 ] } }, "else":{ "t":"$$this", "n":0 } } } } }
Ovenstående $map
går i det væsentlige over input-arrayet og kontrollerer med hvert element, om det er i tags array, der sammenligner t egenskab, hvis den findes, så værdien af n felt i underdokumentet bliver dets nuværende n værdiudtrykt med
{ "$arrayElemAt":[ "$tags.n", { "$indexOfArray":[ "$tags.t", "$$this" ] } ] } ellers tilføj standarddokumentet med en n-værdi på 0.
Overordnet set vil din opdateringshandling være som følger
Din sidste opdateringshandling bliver:
const myTags =["arkitektur", "blabladontexist"];db.getCollection('coll').update( { "_id":"1234" }, [ { "$set":{ "tags ":{ "$concatArrays":[ { "$filter":{ "input":"$tags", "cond":{ "$not":[ { "$in":["$$this.t" , myTags] } ] } } }, { "$map":{ "input":myTags, "in":{ "$cond":[ { "$in":["$$this", "$tags. t"] }, { "t":"$$this", "n":{ "$sum":[ { "$arrayElemAt":[ "$tags.n", { "$indexOfArray":[ "$ tags.t", "$$this" ] } ] }, 1 ] } }, { "t":"$$this", "n":0 } ] } } } ] } } } ], { "upsert":true });