2013-07-24 6 views
1

내가 거기에 이러한 문서가있는 컬렉션을 말해봐 커서에서 동일한 문서를 여러 번 돌려 :MongoDB를 : 배열에 정렬 및

{sort:[1,2,4,6], fruit:'apple'} 
{sort:[3], fruit:'cherry'} 
{sort:[5], fruit:'orange'} 

을 그리고 나는이 유사한 쿼리를 실행하려면 :

db.collection.find().sort({sort: -1}) 

하지만 이렇게 먼저를 dedupeing없이 문서를 반환이 대신

{sort:[1,2,4,6], fruit:'apple'} 
{sort:[1,2,4,6], fruit:'apple'} 
{sort:[3], fruit:'cherry'} 
{sort:[1,2,4,6], fruit:'apple'} 
{sort:[5], fruit:'orange'} 
{sort:[1,2,4,6], fruit:'apple'} 

오 이 :

{sort:[1,2,4,6], fruit:'apple'} 
{sort:[3], fruit:'cherry'} 
{sort:[5], fruit:'orange'} 

현재 MongoDB에서이를 수행 할 수있는 방법이 있습니까?

+0

스냅 샷 모드의 반대편이 있습니까? http://docs.mongodb.org/manual/reference/operator/snapshot/ – RonSper

답변

2

집계 프레임 워크 $unwind operator을 사용하여 배열을 여러 문서로 푸는 데 사용할 수 있습니다.

db.fruits.aggregate(
    {$unwind: "$sort"}, 
    {$sort: {sort: 1}} 
) 

$unwind 동작은 여러 문서, 그 배열의 각각의 값을 생성하여 문서에 배열 "풀릴". 그런 다음 주어진 기준을 정렬합니다. 그래서 입력에 대한 :

> db.fruits.insert({sort:[1,2,4,6], fruit:'apple'}) 
> db.fruits.insert({sort:[3], fruit:'cherry'}) 
> db.fruits.insert({sort:[5], fruit:'orange'}) 

우리는 얻는 결과 출력 : 원래 정렬 배열을 유지해야하는 경우

> db.fruits.aggregate({$unwind: "$sort"}, {$sort: {sort: 1}}) 
{ 
    "result" : [ 
    { 
     "_id" : ObjectId("51f0592c8a542caf3f07fa66"), 
     "sort" : 1, 
     "fruit" : "apple" 
    }, 
    { 
     "_id" : ObjectId("51f0592c8a542caf3f07fa66"), 
     "sort" : 2, 
     "fruit" : "apple" 
    }, 
    { 
     "_id" : ObjectId("51f059358a542caf3f07fa67"), 
     "sort" : 3, 
     "fruit" : "cherry" 
    }, 
    { 
     "_id" : ObjectId("51f0592c8a542caf3f07fa66"), 
     "sort" : 4, 
     "fruit" : "apple" 
    }, 
    { 
     "_id" : ObjectId("51f0593b8a542caf3f07fa68"), 
     "sort" : 5, 
     "fruit" : "orange" 
    }, 
    { 
     "_id" : ObjectId("51f0592c8a542caf3f07fa66"), 
     "sort" : 6, 
     "fruit" : "apple" 
    } 
    ], 
    "ok" : 1 
} 

, 당신은 복사하는 원본 문서의 투영을 만들 $project을 사용할 수 있습니다

db.fruits.aggregate(
    {$project: {sort: 1, fruit: 1, expanded_sort: "$sort"}}, 
    {$unwind: "$expanded_sort"}, 
    {$sort: {expanded_sort: 1}} 
) 

이 지금처럼 결과를 가져옵니다 : 풀려과 같이 다음되는 expanded_sort 필드에 정렬 필드

"result" : [ 
    { 
    "_id" : ObjectId("51f0592c8a542caf3f07fa66"), 
    "sort" : [ 1, 2, 4, 6 ], 
    "fruit" : "apple", 
    "expanded_sort" : 1 
    }, 
+0

그게 내가 원하는 것입니다! 시간을내어 주셔서 감사합니다. – RonSper