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

MongoDB indlejret opslag med 3 niveauer

Årsagen til dine 'problemer' er det andet aggregeringstrin - { $unwind: "$address" } . Det fjerner post for part med _id: 4 (fordi dens adressearray er tom, som du nævner) og producerer to poster for parterne _id: 1 og _id: 5 (fordi hver af dem har to adresser).

  • For at forhindre fjernelse af parter uden adresser bør du indstille preserveNullAndEmptyArrays mulighed for $unwind trin til true .

  • For at forhindre duplikering af parter for deres forskellige adresser bør du tilføje $group aggregeringsstadiet til din pipeline. Brug også $project trin med $filter operatør for at udelukke tomme adresseposter i 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] } }
    } 
  }
}]);


  1. Ringer til Redis zuunionstore fra Lua med variable NØGLER

  2. Sådan sammenkædes strenge i SQL

  3. Lagring af redis hget-værdier i en variabel i nodejs

  4. At finde nøgler, der ikke udløber i Redis