sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB indsæt dokument eller inkrementfelt, hvis det findes i array

Med MongoDB 4.2 og nyere kan opdateringsmetoden nu tage et dokument eller en samlet pipeline hvor følgende trin kan bruges:

  1. $addFields og dets alias $set
  2. $project og dets alias $unset
  3. $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, $filter og det følger:

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 }); 


  1. Hvordan kan konvertere streng til dato med mongo-aggregation?

  2. Hadoop – En Apache Hadoop-tutorials for begyndere

  3. Spring boot / mongo vil ikke oprette indeks med indeksannoteringen

  4. Mongodb returnere gammel samling