2014-09-05 15 views
5

Tôi đang cố gắng để có được một lĩnh vực nhất định từ một mảng subdocumentLàm thế nào để lấy một lĩnh vực nhất định từ một mảng subdocument với mongoose

Tôi sẽ không bao gồm bất kỳ trường nào trong doc mẹ

đây là tài liệu mẫu

{ 
    "_id" : ObjectId("5409dd36b71997726532012d"), 
    "hierarchies" : [ 
     { 
      "rank" : 1, 
      "_id" : ObjectId("5409df85b719977265320137"), 
      "name" : "CTO", 
      "userId" : [ 
       ObjectId("53a47a639c52c9d83a2d71db") 
      ] 
     } 
    ] 
} 

tôi muốn trở lại thứ hạng của hệ thống phân cấp nếu một userId là trong mảng userId

đây là những gì tôi có cho đến nay trong truy vấn của tôi

collectionName.find({{hierarchies: 
    {$elemMatch : {userId: ObjectId("53a47a639c52c9d83a2d71db")}}} 
    , "hierarchies.$.rank", function(err,data){} 

cho đến nay nó trả về toàn bộ đối tượng trong mảng thứ bậc tôi muốn, nhưng tôi muốn giới hạn nó chỉ là thuộc tính xếp hạng của đối tượng.

+0

Bạn đã cố gắng để có được kết quả với 'lean: true' - có thể hoạt động ... Không chắc chắn 100%, chỉ là một ý tưởng. – mbernath

Trả lời

0

Phép chiếu có sẵn cho .find() các truy vấn thường trong MongoDB không thực hiện loại chiếu này cho các phần tử bên trong của mảng. Tất cả những gì bạn thường làm là trả về phần tử "phù hợp" của mảng hoàn toàn.

Đối với những gì bạn muốn, bạn sử dụng aggregation framework thay vào đó, mang đến cho bạn kiểm soát nhiều hơn phù hợp và dự báo:

Model.aggregate([ 
    { "$match": { 
     "hierarchies.userId": ObjectId("53a47a639c52c9d83a2d71db") 
    }}, 
    { "$unwind": "$hierarchies" }, 
    { "$match": { 
     "hierarchies.userId": ObjectId("53a47a639c52c9d83a2d71db") 
    }}, 
    { "$project": { 
     "rank": "$hierarchies.rank" 
    }} 
],function(err,result) { 

}) 

Đó cơ bản phù hợp với tài liệu, lọc nội dung mảng của tài liệu để chỉ trận đấu và sau đó chỉ dự án trường bắt buộc.

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