MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB вложено търсене с 3 нива

Причината за вашите „проблеми“ е вторият етап на агрегиране - { $unwind: "$address" } . Премахва запис за парти с _id: 4 (защото неговият адресен масив е празен, както споменахте) и създава два записа за страни _id: 1 и _id: 5 (тъй като всеки от тях има два адреса).

  • За да предотвратите премахването на партии без адреси, трябва да зададете preserveNullAndEmptyArrays опция за $unwind етап до true .

  • За да предотвратите дублирането на партии за различните му адреси, трябва да добавите $group етап на агрегиране към вашия тръбопровод. Също така използвайте $project етап с $filter оператор за изключване на празни адресни записи в изхода.

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. Отпечатване на изхода на заявката на Mongo във файл, докато сте в mongo shell

  2. Обект на MongoDB, сериализиран като JSON

  3. Не може да стартира MongoDB като услуга

  4. mongod HostnameCanonicalizationWorker грешка на OS X

  5. Проверка на здравето на Mongodb стъпка по стъпка