sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB kapslad uppslagning med 3 nivåer

Orsaken till dina "problem" är det andra aggregeringssteget - { $unwind: "$address" } . Det tar bort post för part med _id: 4 (eftersom dess adressmatris är tom, som du nämner) och producerar två poster för parterna _id: 1 och _id: 5 (eftersom var och en av dem har två adresser).

  • För att förhindra borttagning av parter utan adresser bör du ställa in preserveNullAndEmptyArrays alternativet $unwind steg till true .

  • För att förhindra duplicering av parter för dess olika adresser bör du lägga till $group aggregeringsstadiet till din pipeline. Använd också $project steg med $filter operatör för att utesluta tomma adressposter i utdata.

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. redis Det verkar som om servern har stängt anslutningen

  2. Kör MongoDB på DigitalOcean

  3. MongoDB med redis

  4. HDFS Tutorial – En komplett introduktion till HDFS för nybörjare