我有一個查詢我想在Mongo上運行。本質上,它看起來像這樣:Mongo聚合調用中更詳細的限制?
db.getCollection('termStatistics').aggregate(
{ $filter: { "kind": 0 } },
{
$group:
{
"_id": "$termId",
"count": {$sum: NumberLong(1)}
}
},
{ $sort: {"count": -1} },
{ $limit: 100 }
)
這得到各termId
的數量,給我他們的前100名。但是,我必須爲每個值kind
運行相同的查詢,其中有幾個,因爲用戶需要每個類別的前100名。我想避免在單個查詢中多次返回mongo(實際的過濾器也會執行一些用戶特定的過濾,所以緩存結果是不合理的)。
是否有可能將所有這些合併成一個單一的聚集電話嗎?某種「每種價值的限制」或某種東西?
編輯:這裏有一些樣本文檔。這是有點愚蠢,但它很難用任何他們感興趣的張貼數千份文件....假如我有這些n
副本(具有不同_id
S)爲每個n
1和1000之間:
{ kind: 0, termId: n }
另外,我已經得到了這些n
,1和100各n
之間:爲每一種
{ kind: 1, termId: n }
我要的是前100 termId
。對於kind: 0
這將是[{ _id: 1000, count: 1000 }, ...{ _id: 901, count: 901 }]
和kind: 1
這將是[{ _id: 200, count: 200 }, ..., { _id: 101, count: 101 }]
。
這是很容易做到,但它需要兩個總呼叫(見上文)。這將是很好做一彙總調用和得到的東西像如下:
[
{ kind: 0, data: [{ _id: 1000, count: 1000 }, ...{ _id: 901, count: 901 }]},
{ kind: 1, data: [{ _id: 200, count: 200 }, ...{ _id: 101, count: 101 }]},
]
如果我們只是限制提高到200,我們不會kind: 1
得到任何東西,因爲有不夠共同termId
小號kind: 0
,所以我需要一些其他類型的限制,或者一些非常巧妙的使用它。
希望這是更清晰!
這仍然將只返回100文件,但。我基本需要600份文件 - 每種價值100份。但是,如果我將限制設置爲600,我可能會從最受歡迎的類型中獲得500個(例如),因此其餘的不夠。 –
你可以發表一些樣本文件,你想要你的輸出是什麼? – dyouberg
完成!希望更清楚 –