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

Recherche imbriquée MongoDB avec 3 niveaux

La cause de vos "problèmes" est la deuxième étape d'agrégation - { $unwind: "$address" } . Il supprime l'enregistrement pour la partie avec _id: 4 (parce que son tableau d'adresses est vide, comme vous le mentionnez) et produit deux enregistrements pour les parties _id: 1 et _id: 5 (car chacun d'eux a deux adresses).

  • Pour empêcher la suppression des parties sans adresse, vous devez définir preserveNullAndEmptyArrays option de $unwind passer à true .

  • Pour éviter la duplication des parties pour ses différentes adresses, vous devez ajouter $group étape d'agrégation à votre pipeline. Utilisez également $project étape avec $filter opérateur pour exclure les enregistrements d'adresse vides dans la sortie.

db.party.aggregate([{
  $lookup: {
    from: "address",
    localField: "_id",
    foreignField: "party_id",
    as: "address"
  }
}, {
  $unwind: {
    path: "$address",
    preserveNullAndEmptyArrays: true
  }
}, {
  $lookup: {
    from: "addressComment",
    localField: "address._id",
    foreignField: "address_id",
    as: "address.addressComment",
  }
}, {
  $group: {
    _id : "$_id",
    name: { $first: "$name" },
    address: { $push: "$address" }
  }
}, {
  $project: {
    _id: 1,
    name: 1,
    address: {
      $filter: { input: "$address", as: "a", cond: { $ifNull: ["$$a._id", false] } }
    } 
  }
}]);