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

Ricerca annidata MongoDB con 3 livelli

La causa dei tuoi "problemi" è la seconda fase di aggregazione - { $unwind: "$address" } . Rimuove il record per il party con _id: 4 (perché il suo array di indirizzi è vuoto, come dici tu) e produce due record per le parti _id: 1 e _id: 5 (perché ognuno di essi ha due indirizzi).

  • Per impedire la rimozione di parti senza indirizzo è necessario impostare preserveNullAndEmptyArrays opzione di $unwind fase a true .

  • Per evitare la duplicazione delle parti per i suoi diversi indirizzi dovresti aggiungere $group fase di aggregazione alla pipeline. Inoltre, usa $project fase con $filter operatore per escludere record di indirizzi vuoti nell'output.

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