sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB vnořené vyhledávání se 3 úrovněmi

Příčinou vašich 'problémů' je druhá fáze agregace - { $unwind: "$address" } . Odstraní záznam pro párty s _id: 4 (protože jeho pole adres je prázdné, jak uvádíte) a vytváří dva záznamy pro strany _id: 1 a _id: 5 (protože každá z nich má dvě adresy).

  • Chcete-li zabránit odstranění stran bez adres, měli byste nastavit preserveNullAndEmptyArrays možnost $unwind fázi na true .

  • Abyste zabránili duplikaci stran pro různé adresy, měli byste přidat $group fázi agregace do vašeho kanálu. Použijte také $project fázi s $filter operátor k vyloučení prázdných záznamů adres ve výstupu.

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. Mohou být oznámení redis key space poslána do redis streamu namísto pub/sub kanálu

  2. Samoobslužný MongoDB

  3. Omezení Hadoopu, způsoby, jak vyřešit nevýhody Hadoopu

  4. Přeložte Queryable<T> zpět do IMongoQuery