Mongodb 限制聚合查询中的数组

cla*_*ers 3 mongodb mongodb-query aggregation-framework

我正在尝试编写一个查询来返回每个类别中的前 X 个术语 - 例如前 5 个、前 10 个术语等。每个术语都有一个关联的类别,并且基于另一个stackoverflow 问题的一些帮助,我设法得到了这个:

db.collection.aggregate([
  { 
    $group : { 
      _id :  { 
        category: "$uri.category",
        term: "$uri.term",
      },
      total: { $sum : 1 } 
    }
  },
  { $sort : { total : -1 } },
  { 
    $group : { 
        _id :  "$_id.category",
        terms: { 
            $push: { 
                term: "$_id.term",
                total: "$total"
            }
        }
     }
  }
]);
Run Code Online (Sandbox Code Playgroud)

上面的查询确实有效,并返回如下所示的数据:

[
 { category: "movies", 
   terms: [ { term: "movie 1", total: 5000 }, { term: "movie 2", total: 200 } ... ]
 },
 { category: "sports", 
   terms: [ { term: "football 1", total: 4000 }, { term: "tennis 2", total: 250 } ... ]
 },
]
Run Code Online (Sandbox Code Playgroud)

不过,我试图将术语数组限制为固定数字,即 5 或 10 - 这将对应于每个类别的 X 搜索次数。我一直在尝试各种选项,例如$slice在 中添加$push以减少术语数组,但没有成功。

可以使用聚合框架来实现这一点,还是我应该考虑另一种方法?

小智 8

从 MongoDb 版本 3.1.6 开始,您现在可以在 $project 阶段进行切片:

{
    $project: {
        terms: {
            $slice: ["$terms", 0, 10]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想将 $push 的项目数量限制为 10。

这是问题: https://jira.mongodb.org/browse/SERVER-6074