2011-03-15 2 views
18

배열 개체 인 값이 가장 낮은 숫자로 정렬 된 순서로 문서를 반환하고 싶습니다.Mongodb : 배열 객체로 문서 정렬

나는 db.collection.find().sort({foo.0.bar: 1})을 할 수 있지만 배열의 첫 번째 요소와 일치합니다. 아래의 예문에서 볼 수 있듯이 항목 1을 먼저 정렬하고 (foo.0.bar = 5), 반환하려고합니다. 항목 2 처음으로 (foo.2.bar = 4)에는 가장 낮은 값을 가진 개체가 있으므로

{ 
    "name": "Item 1", 
    "foo": [ 
     { 
      "bar": 5 
     }, 
     { 
      "bar": 6 
     }, 
     { 
      "bar": 7 
     } 
    ] 
} 
{ 
    "name": "item 2", 
    "foo": [ 
     { 
      "bar": 6 
     }, 
     { 
      "bar": 5 
     }, 
     { 
      "bar": 4 
     } 
    ] 
} 
+0

db.collection.find() ({foo.bar : 1}). – Troglo

답변

0

mongo에서 직접 작업 할 수있는 방법은 없습니다. map/reduce를 사용하여 각 배열의 최소값을 검색 한 다음 해당 최소 값을 기준으로 정렬합니다.

+0

감사합니다. 그러나 예제에서 map/reduce 함수는 어떻게 생겼을까요? –

4

map/reduce를 사용하는 대신 배열의 최소값을에서 별도의 필드로 저장하는 것이 좋습니다. 당신이 주문할 수있는 서류. 배열에 추가 할 때 새 값이 현재 기록 된 최소값보다 낮 으면이 필드도 업데이트됩니다.

첫 번째 문서 ("미니 바와 추가"참고)이 될 것입니다 :

{ 
    "name": "Item 1", 
    "minbar" : 5, 
    "foo": [ 
     { 
      "bar": 5, 
     } 
     { 
      "bar": 6, 
     } 
     { 
      "bar": 7, 
     } 
    ] 
} 
+0

이것은 훌륭한 아이디어입니다.이 예제에서는 잘 작동합니다. 그러나 여러 배열 (예 : 내 실제 스키마)에서이 작업을 수행해야하는보다 복잡한 스키마에서는 약간 지저분해질 수 있습니다. –

19

몽고 이 작업을 수행 할 수있는 것 같다. 예를 들어

, 나는 다음과 같은 서류가있는 경우 다음

{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 

그리고 실행 : 당신이 볼 수 있듯이

db.collection.find({}).sort({ "a.b.c":1 }); 
// produces: 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 

db.collection.find({}).sort({ "a.b.c":-1 }); 
// produces: 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 
{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 

{"a.b.c":1}에 의해 정렬 모든 값의 소요를 배열에 배열하고 정렬합니다. 반면에 {"a.b.c":-1}의 정렬은 모든 값 중이 입니다.

+1

두 출력 모두 동일한 결과를 생성합니다. 그 맞습니까? – Raman

+4

당신은 면밀히 관찰해야합니다. 첫 번째 결과는 0, 1, 1, 3입니다. 두 번째는 12,9,5,4가 내림차순입니다. – rompetroll

4

당신은 몽고 버전 2.2에서 집계 명령을 사용하여 이러한 종류의 작업을 수행 할 수 있습니다 종류의

db.collection.aggregate([{$unwind: "$foo"}, 
    {$project: {bars:"$foo.bar"}}, 
    {$group: {_id:"$_id",min:{$min: "$bars"}}}, 
    {$sort: {min:1}}]) 
+0

예를 들어 주셔서 감사합니다. – Vor