Mongo查询限制每个匹配的数量

4

我有一个MongoDB集合,看起来像这样:

{
  title: String,
  category: String
}

我想编写一个查询,选择各种类别,类似于以下内容:

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

但是我只想选择每个类别的有限数量,例如每种书、汽车、人物只选5个。我该如何编写这样的查询?我可以用一个查询完成还是必须使用多个查询?

1个回答

4
你可以使用mongodb 聚合来实现。看一下这个管道:
  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]}}}
])

这个做到了我想要的,但是性能如何?如果这是最好的方法,那么它比为每个类别使用查找更快吗?从我的理解来看,我需要推送我想要的每个字段,如果我不知道该项具有哪些字段,则会出现问题。 - Dooderino
性能相当低,因为您需要构建一个大数组,然后从中创建一个子集。我不知道有更好的方法来做到这一点。如果您想将所有字段推送到数组中,则可以利用$$CURRENT。{$push: "$$CURRENT"} - Volodymyr Synytskyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接