2014-09-01 2 views
0

$ elemMatch를 사용하여 일치하는 모든 값을 가져오고 싶습니다.임베디드 배열을 검색하는 방법

// create test data 
db.foo.insert({values:[0,1,2,3,4,5,6,7,8,9]}) 
db.foo.find({},{ 
    'values':{ 
     '$elemMatch':{ 
      '$gt':3 
     } 
    } 
}) ; 

나의 expecected 결과는 {values ​​: [3,4,5,6,7,8,9]}입니다. 하지만 실제로 결과는 {values ​​: [4]}입니다. mongo 문서를 읽었습니다. 사양입니다.

어떻게 다중 값을 검색합니까? 그리고 더, 나는 '건너 뛰기'와 '제한'을 사용합니다.

아이디어가 있으십니까? 집계를 사용

답변

1

: 당신이 좋아하면

db.foo.aggregate([ 
{$unwind:"$values"}, 
{$match:{"values":{$gt:3}}}, 
{$group:{"_id":"$_id","values":{$push:"$values"}}} 
]) 

당신은 $ 경기에서 추가 필터 조건을 추가 할 수 있습니다.

당신은 이후이 사용 $ elemMatch 연산자를 달성 할 수없는, MongoDB의의 의사는 말한다 :

$ elemMatch 투영 오퍼레이터가 조회 결과에 포함되는 배열 필드의 내용 만 포함하도록 제한 배열 $$ elemMatch 조건과 일치하는 요소.

The elements of the array are documents. 
+0

감사합니다. 나는 수집 구조를 다시 고려한다. 덕분에 – sekitaka

0

당신이 $elemMatch에 대한 설명서 또는 positional $ 연산자 조회 할 대응을주의 깊게 보면 다음 볼 것입니다 만 "첫 번째" 일치하는 요소는이 유형의 "투영법"에 의해 반환됩니다.

당신이 찾고있는 것은 실제로 원본 또는 "일치"요소를 반환하지 않고 문서의 배열 내용을 "필터링"하려는 문서 내용의 "조작"입니다. 시합. 배열 값은 "고유

db.foo.aggregate([ 

    // No point selecting documents that do not match your condition 
    { "$match": { "values": { "$gt": 3 } } }, 

    // Unwind the array to de-normalize as documents 
    { "$unwind": "$values }, 

    // Match to "filter" the array 
    { "$match": { "values": { "$gt": 3 } } }, 

    // Group by to the array form 
    { "$group": { 
     "_id": "$_id", 
     "values": { "$push": "$values" } 
    }} 
]) 

또는 2.6 이후에서 MongoDB를 현대 버전 : 진정한 문서 조작 거기에 더 많은 지원을이대로 집계 프레임 워크가 필요합니다"필터링 "를

"당신은 이것을 할 수 있었다 :

db.foo.aggregate([ 
    { "$project": { 
     "values": { 
      "$setDifference": [ 
       { "$map": { 
        "input": "$values", 
        "as": "el", 
        "in": { 
         "$cond": [ 
          { "$gt": [ "$$el", 3 ] }, 
          "$$el", 
          false 
         ] 
        } 
       }}, 
       [false] 
      ] 
     } 
    }} 
]) 
+0

. '$ elemMatch'를 사용하는 방법을 이해합니다. 수집 구조를 다시 고려합니다. – sekitaka

관련 문제