2016-11-10 65 views
1

我有一個查詢我想在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,所以我需要一些其他類型的限制,或者一些非常巧妙的使用它。

希望這是更清晰!

回答

0

不是100%確定你正在嘗試做什麼,但是你可以嘗試對「kind」字段和術語進行分組,而不是先使用$ match或$ filter。

喜歡的東西:

db.getCollection('termStatistics').aggregate(
    { 
     $group: { 
      "_id": { 
       "kind": "$kind", 
       "term": "$termId" 
      }, 
      "count": { 
       $sum: NumberLong(1) 
      } 
     } 
    }, 
    { $sort: {"count": -1} }, 
    { $limit: 100 } 
) 
+0

這仍然將只返回100文件,但。我基本需要600份文件 - 每種價值100份。但是,如果我將限制設置爲600,我可能會從最受歡迎的類型中獲得500個(例如),因此其餘的不夠。 –

+0

你可以發表一些樣本文件,你想要你的輸出是什麼? – dyouberg

+0

完成!希望更清楚 –