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

Aktualisieren oder ergänzen Sie eine Untersammlung in Mongo

Ich bin mir nicht sicher, ob es einen direkten Weg gibt, dies in einer einzigen Abfrage zu tun,

Update mit Aggregationspipeline ab MongoDB v4.2,

  • $cond um zu prüfen, ob der Name in subColl ist Array,
  • wahre Bedingung, muss mit existierendem Objekt $map zusammengeführt werden Um die Schleife zu durchlaufen, prüfen Sie die Bedingung, wenn sie der Bedingung entspricht, und führen Sie dann das neue Datenobjekt mit dem aktuellen Objekt unter Verwendung von $mergeObjects zusammen
  • falsche Bedingung, Arrays müssen verknüpft werden, aktueller subColl Array und neues Objekt mit $concatArrays
const _id = 123;
const update = { name: 'John', other: 1000 };

Schema.findOneAndUpdate(
  { _id: _id },
  [{
    $set: {
      subColl: {
        $cond: [
          { $in: [update.name, "$subColl.name"] },
          {
            $map: {
              input: "$subColl",
              in: {
                $cond: [
                  { $eq: ["$$this.name", update.name] },
                  { $mergeObjects: ["$$this", update] },
                  "$$this"
                ]
              }
            }
          },
          { $concatArrays: ["$subColl", [update]] }
        ]
      }
    }
  }]
)

Spielplatz