MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mettre à jour ou ajouter à une sous-collection dans mongo

Je ne suis pas sûr qu'il existe un moyen direct de le faire en une seule requête,

Mise à jour avec pipeline d'agrégation à partir de MongoDB v4.2,

  • $cond pour vérifier que le nom est dans subColl tableau,
  • condition vraie, besoin de fusionner avec un objet existant, $map pour itérer la boucle, vérifiez la condition si elle correspond à la condition, puis fusionnez le nouvel objet de données avec l'objet actuel à l'aide de $mergeObjects
  • condition fausse, besoin de concaténer les tableaux, subColl actuel tableau et nouvel objet en utilisant $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]] }
        ]
      }
    }
  }]
)

Aire de jeux