MongoDB聚合:如何查询每组有限数量的“顶级”文档?

时间:2013-12-10 12:57:56

标签: mongodb mongodb-query aggregation-framework

假设我有一个包含员工文档的MongoDB集合:

{
  name : "John Doe",
  department : "Finance",
  salary : 100
}

如何查询每个部门薪资最高的X员工?

修改

为了让自己更清楚一点,这就是我想到的结果:

db.collection.aggregate(
    {$sort : {salary : -1}},
    {$group : {
        _id : "$department"
        employees : {$addToSet : "$name"}
    },
    {$project : {employees : {$slice : X}}}
)

但这不会有两个原因:  1. $ addToSet不保证输出集的任何排序(至少根据documentation)  2. $slice doesn't work in the aggregation framework

2 个答案:

答案 0 :(得分:1)

虽然它不是最佳性能,但您可以实现此返回集合,然后排序/接收代码。如果你想通过命令行来使用它,比如

db.collection.find({ Department : 'Sales' }).sort({Salary:-1}).limit(50)

应该有用。

答案 1 :(得分:0)

也许以下查询可以帮助您解决问题。

通过使用聚合查询,您可以先对数据进行排序,然后使用限制来限制所需薪水最高的用户数。最后,您可以按部门对用户进行分组。

db.test.aggregate(
  {$sort : {salary : -1}},
  {$limit : 5},
  {$group : {_id:"$department", employees : {$addToSet : "$name"}}}
)