2016-01-15 53 views
1

我有一個蒙戈集合看起來是這樣的:蒙戈找到限制每場比賽

{ 
    title: String, 
    category: String 
} 

我想寫一個查詢,選擇不同類別,與此類似:

Collection.find({category: {$in: ['Books', 'Cars', 'People']}); 

但我希望僅選擇每個類別的有限數量,例如每本書,汽車,人的5個。我如何編寫這樣的查詢?我可以做一個查詢嗎?還是我必須使用多個?

回答

2

你可以使用mongodb aggregation。看看這個管道:

  1. 按類別篩選所有文件(使用$match)。
  2. 按類別分組數據併爲具有相同類別的項目創建數組(使用$group$push)。
  3. 獲取有限最大長度的每個陣列的子集(使用$project$slice)。

嘗試以下查詢:

db.collection.aggregate([ 
    {$match: {category: {$in: ['Books', 'Cars', 'People']}}}, 
    {$group: {_id: "$category", titles: {$push: "$title"}}}, 
    {$project: {titles: {$slice: ["$titles", 5]}}} 
]) 
+0

這確實是我想要的,但怎麼樣的表現?如果這是做到這一點的最佳方式,是否比簡單地爲每個類別使用查找更快?據我所知,我需要推動每個領域,我想要的,這是一個問題,如果我不知道該項目有什麼領域 – Dooderino

+0

性能是相當低的,因爲你需要建立一個大型的數組,然後從它創建一個子集。爲了做到這一點,我不知道有什麼更好的辦法。如果您想將所有字段推送到數組,您可以利用[$$ CURRENT](https://docs.mongodb.org/manual/reference/aggregation-variables/)。 {$ push:「$$ CURRENT」} –