2013-08-14 5 views
1

안녕하세요, 그래서 어떻게 사용자의 친구 컬렉션에 속하는 특정 배열 항목을 쿼리합니까. 여기 사용자에게 속한 배열 항목을 쿼리하는 방법은 무엇입니까?

쿼리입니다 :

Friend.find({userId: req.signedCookies.userid, 'friendStatus.labels': req.body.searchLabels 
      }, function(err, users) { 

이 세분화 사용자 ID가 다음 난 그냥 객체에 중첩 된 라벨 배열 내부의 라벨에 액세스하려는 사용자의 문서에 서명 찾을 수있는 방법입니다

> db.friends.find({'firstName': "test3"}).pretty() 
{ 
     "__v" : 0, 
     "_id" : ObjectId("520a4944c24d995410000008"), 
     "accepted_notifications" : true, 
     "added_notifications" : true, 
     "firstName" : "test3", 
     "firstNameTrue" : "test3", 
     "friendStatus" : [ 
       { 
         "favorites" : 1, 
         "fuId" : ObjectId("520a4905c24d995410000001"), 
         "labels" : [ 
           "new", 
           "old" 
         ], 
         "notes" : "He likes me", 
         "status" : 3 
       }, 
       { 
         "fuId" : ObjectId("520a4925c24d995410000004"), 
         "labels" : [ ], 
         "notes" : "sadwa", 
         "status" : 3 
       } 
     ], 
     "lastName" : "test3s", 
     "lastNameTrue" : "TEST3s", 
     "notifications" : 0, 
     "userId" : ObjectId("520a4944c24d995410000007") 
} 

내가 콜백을 사용할 때 현재 쿼리가 전체 문서를 반환하는 여기

문서의 예입니다 ... friendStatus 배열 안에 사용자는하지만, 난 그냥 일치하는 레이블 그것의이 당겨하려면 :

{ 
          "favorites" : 1, 
          "fuId" : ObjectId("520a4905c24d995410000001"), 
          "labels" : [ 
            "new", 
            "old" 
          ], 
          "notes" : "He likes me", 
          "status" : 3 
        }, 

답변

5

당신은,이를 구체적으로 $match$project 운영하는 통합 프레임 워크를 사용할 수 있습니다. $match은 일반 쿼리와 매우 흡사하게 문서를 일치시키고, $project을 사용하면 쿼리 출력에서 ​​반환 할 필드를 선택할 수 있습니다. 당신의 설정을위한 집계 쿼리는 다음과 같습니다

Friend.aggregate([{$match: {userId: req.signedCookies.userid,'friendStatus.labels': req.body.searchLabels}}, {$project: {'friendStatus.labels': 1}}]) 

더 많은 문서는 여기에서 찾을 수 있습니다 : http://docs.mongodb.org/manual/reference/aggregation/operators/

관련 문제