2013-07-24 21 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'} 

代替鄰f這個:

{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創建原始文檔複製的投影排序字段爲expanded_sort場,然後將其展開,就像這樣:

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

這可以讓你的結果,像這樣:

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

這正是我想要的!感謝您花時間。 – RonSper