sql >> Database >  >> NoSQL >> MongoDB

MongoDB geneste zoekopdracht met 3 niveaus

De oorzaak van uw 'problemen' is de tweede aggregatiefase - { $unwind: "$address" } . Het verwijdert record voor feest met _id: 4 (omdat de adresreeks leeg is, zoals u zegt) en twee records produceert voor partijen _id: 1 en _id: 5 (omdat ze elk twee adressen hebben).

  • Om te voorkomen dat partijen zonder adressen worden verwijderd, moet u preserveNullAndEmptyArrays . instellen optie van $unwind stadium naar true .

  • Om dubbele partijen voor de verschillende adressen te voorkomen, moet u $group . toevoegen aggregatiefase naar uw pijplijn. Gebruik ook $project podium met $filter operator om lege adresrecords in uitvoer uit te sluiten.

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


  1. Implementeer een GraphQL API met MongoDB Atlas en Apollo Server op Koyeb

  2. MongoDB pull-element van array twee niveaus diep

  3. Hoe werk ik MongoDB-documentvelden alleen bij als ze niet bestaan?

  4. Laravel - Wis alle cache / redis-sleutels die een specifieke tekenreeks bevatten