2014-11-04 92 views
1

我用這個紅寶石驅動程序蒙戈:https://github.com/mongodb/mongo-ruby-driver蒙戈篩選結果由不同領域

我有一個集合中的許多文件是這樣的:

{ 
    "_productId" => 10 
    .... 
} 
{ 
    "_productId" => 10 
    .... 
} 
{ 
    "_productId" => 12 
    .... 
} 

什麼是獲得具有鮮明的所有文件的要求「_productId」,我的意思是我想要拿這個例子中的第一個和最後一個收集項目。

+0

你看過['聚合框架'](http://docs.mongodb.org/manual/reference/method/db.collection.aggregate/)嗎? – 2014-11-04 15:46:27

+0

你會在第二個項目上選擇第一個項目的依據是什麼? – BatScream 2014-11-04 22:06:48

回答

0

隨着從一組中選擇一個文件是未知的,並假設第一文檔的基礎對於每個要選擇的productid是基於它們的插入順序,可以使用聚合運算符$group,$project

根據他們的productId分組所有記錄,從每個組中選擇first文檔。

db.collection.aggregate([ 
{$group:{"_id":"$_productId","distinct_doc":{$first:"$$ROOT"}}}, 
{$project:{"distinct_doc":1,"_id":0}} 
]) 

如果爲每個文檔的_id字段,第一文件是將其首先插入該特定組中的一個。如果您選擇基於其他字段執行此操作,則在對記錄進行分組之前,您需要執行額外的$sort操作。

例如,

db.collection.aggregate([ 
{$sort:{"someField":1}}, 
{$group:{"_id":"$_productId","distinct_doc":{$first:"$$ROOT"}}}, 
{$project:{"distinct_doc":1,"_id":0}} 
]) 

在這種情況下,每組的第一個文檔,將排序時非常頂部的一個。