Med MongoDB 4.2 og nyere kan opdateringsmetoden nu tage et dokument eller en samlet pipeline hvor følgende trin kan bruges:
$addFields
og dets alias$set
$project
og dets alias$unset
$replaceRoot
og 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 });