当前位置: 首页 > 知识库问答 >
问题:

如何组合两个MongoDB聚合管道查询的结果,并在不使用$facet的情况下对组合结果执行另一个聚合查询?

梁丘霖
2023-03-14

在各种聚合管道阶段之后,我的第一个查询返回以下结果:

{ 
    "group" : "A",
    "count" : 6, 
    "total" : 20
},
{
    "group" : "B",
    "count" : 2,
    "total" : 50
}

在各种聚合管道阶段之后,我的第二个查询返回以下结果:

{
    "group": "A",
    "count": 4,
    "total": 80
},
{
    "group": "C",
    "count": 12,
    "total": 60
}

这两个查询都在同一个集合上执行,但是根据管道阶段对数据进行不同的分组和转换。

我的两个查询都使用不同的$match条件,具有不同的管道阶段,包括$facet、$unwind、$group、$project$map、$reduce、$zip、$subtract等操作符。。。

db.collection.aggregate([
{ $unwind...},
{ $match....},
{ $facet...},
...
])

当我使用$facet以并行查询的方式运行查询时,会出现以下错误(因为我已经在现有查询中使用$facet):

$facet is not allowed to be used within a $facet stage

预期产出:

我需要找到每个组的平均值。

为此,我需要组合两个查询的结果,并对组合的结果执行查询。

我的组合阶段应该如下所示:

{ 
    "group" : "A",
    "count" : 10, 
    "total" : 100 
},
{
    "group" : "B",
    "count" : 2,
    "total" : 50
},
{
    "group": "C",
    "count": 12,
    "total": 60
}

每组平均值的预期最终结果:

{
    "group" : "A",
     "avg" : 10 
},
{
    "group" : "B",
    "avg" : 25
},
{
    "group": "C",
    "avg": 5
}

MongoDB聚合管道中是否有任何操作符可以在不修改现有查询的情况下实现这一点?

如何实现这个用例?

谢谢!


共有2个答案

邬飞捷
2023-03-14

有不同的方法来组合结果,包括$merge,它是在4.2中引入的

但我使用了以下方法,因为我使用的是4.0版

将两个聚合查询结果保存在一个变量中,然后将其插入新的临时集合:

var result  = db.collection.aggregate(...); //query1 here
db.temp.insert(result.toArray());

var result  = db.collection.aggregate(...); //query2 here
db.temp.insert(result.toArray());

// Find out average
db.temp.aggregate([
    {
        $group: {
            _id: "$group",
            count: { $sum: "$count" },
            total: { $sum: "$total" }
        }
    },
    {
        $project: {
            _id: 0,
            group: "$_id",
            avg: { $divide: [ "$total", "$count" ] }
        }
    }
]).pretty()
蒋俊
2023-03-14

您可以使用$facet单独运行查询,然后通过group使用以下转换到group组合结果,并计算平均值:

db.collection.aggregate([
    {
        $facet: {
            first: [ { $match: { "_": true } } ], // your first query
            second: [ { $match: { "_": false } } ], // your second query
        }
    },
    {
        $project: {
            all: {
                $concatArrays: [ "$first", "$second" ]
            }
        }
    },
    {
        $unwind: "$all"
    },
    {
        $group: {
            _id: "$all.group",
            count: { $sum: "$all.count" },
            total: { $sum: "$all.total" },
        }
    },
    {
        $project: {
            _id: 0,
            group: "$_id",
            count: 1,
            total: 1,
            avg: { $divide: [ "$total", "$count" ] }
        }
    }
])

蒙哥游乐场

注意:我使用\u字符来指示文档来自哪个查询。显然,您不需要它,您可以用自己的查询替换$facet查询

 类似资料:
  • 我不熟悉Mongo中的聚合查询,并且一直在努力产生我想要的输出。我有以下聚合查询: 返回以下结果: 如何修改聚合查询,以便只返回2个文档而不是3个文档?将两个“ABC-123”结果合并为一个结果,并使用带有“bu”和“count”字段的新计数数组,即。 非常感谢

  • 我有以下JPA实体(getter、setter和非相关字段省略): 我的目标是使用JPQL或criteriaAPI实现查询,它将返回每天的平均事务量和最大事务量。 产生预期结果的原生SQL查询(MySQL数据库)如下所示: 遗憾的是,不鼓励使用本机 SQL 查询,并且 JPQL 不允许在 where 子句中使用子查询。 提前谢谢你。 附加: 我从以下Spring数据查询开始: 但显然没有用: 我可

  • 问题内容: 有一个对话列表,每个对话都有一个消息列表。每个消息都有一个不同的字段和一个字段。我们需要考虑的是,在对话的第一条消息中使用了动作,在几条消息中使用了动作之后,过了一会儿,依此类推(有一个聊天机器人意图列表)。 将对话的消息动作分组将类似于: 问题: 我需要使用ElasticSearch创建一个报告,该报告将返回每次会话的;接下来,我需要对类似的东西进行分组并添加一个计数;最终将导致as

  • 本文向大家介绍MongoDB聚合分组多个结果,包括了MongoDB聚合分组多个结果的使用技巧和注意事项,需要的朋友参考一下 要聚合多个结果,请在MongoDB中使用$group。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是汇总组多个结果的查询- 这将产生以下输出-

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 问题内容: 我有一个非常庞大的查询,其最简单的形式如下所示: 我需要再添加一个条件,该条件可以让我获得每个代表的应用程序日期不为空的用户数(例如:rep 1具有3个用户的应用程序日期已填写),并将其分配给类别(由于3个用户,rep是某个状态类别)。看起来像这样: 但是,如果我只是将其添加到select语句中,则所有代表将变为status1,因为sum()是在所有使用申请日期的顾问程序上完成的: 您