【问题标题】:How to count resulting grouped objects in aggregation?如何计算聚合中产生的分组对象?
【发布时间】:2020-01-21 04:15:05
【问题描述】:

以聪明的方式。 简单的分页任务。我有 1000 个对象,想将它们分组并一次发送到 API 10。

db.getCollection('myCollection').aggregate([
    {
        "$group": {
            "_id": {
                "name": "$name",
            },
            "count": {
                "$sum": 1
            },
            "surnames": {
                "$addToSet": "$surname"
            },
            "objects": {
                "$push": "$$ROOT"
            },
        }
    },
    {$limit:10},
    {$skip:300}
],  { allowDiskUse: true }
) 

这将给我 10 个对象,从第 300 个开始。凉爽的。 如何获得分组对象的总数?

$count 阶段不允许我保留分组结果

做这个技巧:

{$group: {_id: null, $totalCount:{$sum:1}, $results: { "$push": "$$ROOT"}}

然后取消分组会破坏我的限制并且看起来不是很聪明。

当然,以 $count 作为最后阶段且没有限制进行另一个聚合不是一种选择。因为速度。

我很乐意为您提供任何建议。

【问题讨论】:

  • 谢谢米克尔! $Fracet 可以正是我想要的。我将在接下来的几天内对其进行测试并留下评论。
  • 您可以先运行$group,然后使用计数运行$facet
  • 是的,这就是计划
  • 杰普,它正在工作。 @mickl 可以根据您的评论创建一个答案(看这里:...)所以我可以给它加星标是“好答案”?

标签: mongodb pagination aggregation


【解决方案1】:

首先我认为您需要切换$limit$skip 阶段的位置。

因为您按name 分组,您可以在该字段上使用Mongo 的distinct 并检查数组的length,如下所示:

let names = await db.collection.distinct("name");
let totalLength = names.length - 300;

【讨论】:

  • 感谢您的回答,汤姆!您能否提供有关您建议切换 $limit 和 $skip 阶段位置的部分的更多信息?关于“不同” - 这是我过度简化任务的错。我按多个字段分组,通过几层投影传递结果等等 - 简而言之,我不能只索引名称并通过 distinct 运行它。可悲-(
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 2019-11-18
  • 2023-01-12
  • 2014-12-24
  • 2013-05-13
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多