2016-01-15 52 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”} –