2016-09-13 12 views
6

Tiêu đề nói lên tất cả. Làm thế nào đến nếu một tài liệu không dẫn đến bất kỳ tài liệu bên ngoài phù hợp theo lĩnh vực phù hợp của nó, sau đó làm thế nào đến nó không được bao gồm trong bộ kết quả của đường ống?

Tôi đang thử nghiệm các trình tổng hợp mới trong Mongo 3.2 và tôi đã đi xa để thực hiện tra cứu mảng lồng nhau bằng cách mở thư đầu tiên và sau đó nhóm các tài liệu sao lưu. Tất cả những gì tôi còn lại là để có kết quả bao gồm tất cả các tài liệu cục bộ không đáp ứng các tiêu chí $lookup, đó là những gì tôi nghĩ là định nghĩa tiêu chuẩn về "tham gia bên ngoài bên trái".

Dưới đây là các truy vấn:

db.users.aggregate([ 
    { 
     $unwind: "$profile", 
     $unwind: "$profile.universities" 
    }, 
    { 
     $lookup: { 
      from: "universities", 
      localField: "profile.universities._id", 
      foreignField: "_id", 
      as: "profile.universities" 
     } 
    }, 
    { 
     $group: { 
      _id: "$_id", 
      universities: { 
       $addToSet: "$profile.universities" 
      } 
     } 
    } 
]).pretty() 

Vì vậy, nếu tôi có một user có một profile.universities mảng trống rỗng, sau đó tôi cần nó để được bao gồm trong tập hợp kết quả không phụ thuộc vào $lookup trả lại bất kỳ trận đấu, nhưng nó không phải. Làm thế nào tôi có thể làm điều này, và bất kỳ lý do tại sao Mongo xây dựng $lookup để hoạt động theo cách này?

Trả lời

16

Hành vi này không liên quan đến $lookup, đó là do hành vi mặc định cho $unwind là bỏ qua tài liệu mà trường tham chiếu bị thiếu hoặc một mảng trống.

Để giữ gìn các tài liệu unwound ngay cả khi profile.universities là một mảng trống rỗng, bạn có thể thiết lập tùy chọn preserveNullAndEmptyArrays của nó để true:

db.users.aggregate([ 
    { 
     $unwind: "$profile", 
     $unwind: { 
      path: "$profile.universities", 
      preserveNullAndEmptyArrays: true 
     } 
    }, 
    { 
     $lookup: { 
      from: "universities", 
      localField: "profile.universities._id", 
      foreignField: "_id", 
      as: "profile.universities" 
     } 
    }, 
    { 
     $group: { 
      _id: "$_id", 
      universities: { 
       $addToSet: "$profile.universities" 
      } 
     } 
    } 
]).pretty() 
+1

tuyệt vời, đây là chính xác vấn đề. Cảm ơn bạn rất nhiều!! –

Các vấn đề liên quan