2014-09-04 72 views
0

聚合管道後,我得到一個對象列表,但沒有辦法檢索第N個對象。如何在mongodb中進行聚合後訪問特定元素?

參見:

http://docs.mongodb.org/manual/reference/operator/aggregation/group/#retrieve-distinct-values 

的文檔具有輸出像這樣:

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") } 
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") } 
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") } 
{ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") } 
{ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-04T21:23:13.331Z") } 

這是一組對象,但它不是在一個列表,所以你不能做的東西一樣:

results [1]獲取第二個對象。你應該如何與這個團隊互動?

回答

0

首先,如果使用db.collection.distinct(<fieldname>)功能,你可以得到一個字段的不同值作爲數組:

> db.animals.distinct("call") 
["moo", "baa", "woof", "meow", "quack"] 

,然後你可以解引用的結果,因爲它是一個數組。

> calls = db.animals.distinct("call") 
> calls[3] 
"meow" 

彙總爲不同的值是免費的db.collection.distinct(),所述大限制它返回一個光標放在不同的值,而不是一個大的陣列,這意味着沒有16MB BSON極限,並且不同的功能,可以使用索引以涵蓋操作。所以,當你有一個巨大的獨特值時使用聚合方法,否則使用獨特的函數。雖然你可以在光標上調用.toArray()並獲得數組中的所有結果,但如果結果太多而無法使用db.collection.distinct(),那麼這是一個壞主意。你應該通過遊標進行迭代,並挑選出那些你想要的價值觀和做的東西與他們:

> var k = 0 
> var calls = db.animals.aggregate(<pipeline for distinct animal calls>) 
> while (calls.hasNext()) { 
    var call = calls.next() 
    k++ 
    if (k == 96) doStuff(call) 
} 

您可以在管道插入$skip階段,使服務器直接跳到你想要的第一個結果,如果您還包含$sort以修復結果將返回的訂單。如果您知道只需要一定金額,則還可以使用$limit,然後再次使用.toArray()方法。

0

在MongoDB 2.6之前,聚合方法的結果作爲單個文檔返回,結果放在數組中。這已更改爲適應更大的結果集,這些結果集將超過受此表單限制的16MB BSON限制。現在返回的遊標實際上是一個選項,但在shell中默認打開。

如果你的結果不是很大,實際上有一個.toArray()的「幫手」方法,它只是通過將遊標結果轉換爲數組來實現你想要的。它確實光標迭代引擎蓋下,但基本上只是隱藏,從你:

var results = db.collection.aggregate(pipeline).toArray() 

然後,只需訪問該元素,它是一個數組所以n-1

var result = results[8]; 

類似的方法也適用於大多數驅動程序,否則在驅動程序中不包含「光標」選項。