MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wyszukiwanie zagnieżdżone MongoDB z 3 poziomami

Przyczyną Twoich „kłopotów” jest drugi etap agregacji — { $unwind: "$address" } . Usuwa zapis strony o _id: 4 (ponieważ jego tablica adresów jest pusta, jak wspomniałeś) i tworzy dwa rekordy dla stron _id: 1 i _id: 5 (ponieważ każdy z nich ma dwa adresy).

  • Aby zapobiec usuwaniu stron bez adresów, powinieneś ustawić preserveNullAndEmptyArrays opcja $unwind etap do true .

  • Aby zapobiec duplikowaniu stron dla różnych adresów, należy dodać $group etap agregacji do potoku. Użyj także $project etap z $filter operatora, aby wykluczyć puste rekordy adresu w danych wyjściowych.

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
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Agregacja MongoDB z sumą wartości tablicy

  2. MongoDB C# Driver 2.0 — dokument aktualizacji

  3. Zabezpieczenia wywłaszczające z rejestrowaniem audytu dla MongoDB

  4. Mongodb:Wykonaj zapytanie o zakres dat z ObjectId w powłoce mongo

  5. Czy GridFS jest wystarczająco szybki i niezawodny do produkcji?