MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tra cứu lồng nhau MongoDB với 3 cấp độ

Nguyên nhân gây ra 'rắc rối' của bạn là ở giai đoạn tổng hợp thứ hai - { $unwind: "$address" } . Nó xóa bản ghi cho bên có _id: 4 (vì mảng địa chỉ của nó trống, như bạn đề cập) và tạo ra hai bản ghi cho các bên _id: 1_id: 5 (vì mỗi người trong số họ có hai địa chỉ).

  • Để ngăn chặn việc xóa các bên không có địa chỉ, bạn nên đặt preserveNullAndEmptyArrays tùy chọn của $unwind chuyển thành true .

  • Để ngăn việc sao chép các bên cho các địa chỉ khác nhau, bạn nên thêm $group giai đoạn tổng hợp vào đường dẫn của bạn. Ngoài ra, hãy sử dụng $project giai đoạn với $filter toán tử để loại trừ các bản ghi địa chỉ trống trong đầu ra.

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. Đang cố gắng lấy danh sách các bộ sưu tập từ mongoose

  2. Tùy chọn sử dụngFindAndModify không được hỗ trợ

  3. Dữ liệu Ember phân cấp đa cấp với luôn được nhúng

  4. Truy vấn Mongodb vào tháng, ngày, năm ... của ngày giờ

  5. MongoDB:tìm và tìm thấy với tính năng lọc mảng lồng nhau