MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So schalten Sie ein Element in einem Array in MongoDB um

Wenn Sie das Dokument aktualisieren, können Sie die Pipeline innerhalb der Aktualisierung verwenden . Aber diese Funktion ist mit MongoDB Version 4.2 oder höher verfügbar.

db.collection.update(
  { },
  [
     { 
          $set: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
  ]
)

HINWEIS: Angenommen die Variable element ist eine Zeichenfolge Wert.

Wenn Sie nur abfragen, können Sie die folgende Aggregation verwenden:

db.collection.aggregate([
     { 
          $addFields: { 
              arr: { 
                  $cond: [ { $in: [ element, "$arr" ] }, 
                           { $setDifference: [ "$arr", [ element ] ] }, 
                           { $concatArrays: [ "$arr", [ element ] ] } 
                  ] 
              }
          }
     }
] )

Wenn Sie jedoch eine frühere MongoDB-Version als 4.2 verwenden, können Sie die zusammengefasste Ausgabe von oben verwenden, um das Dokument zu aktualisieren:

db.collection.aggregate( [
  // aggregation pipeine from above ...
] ).forEach( doc => db.collection.updateOne( { _id: doc._id }, { $set: { arr: doc.arr } } ) )