Mongodb 如何在一个mongo查询中获得顶级元素和一个低级数组元素的聚合?

Mongodb 如何在一个mongo查询中获得顶级元素和一个低级数组元素的聚合?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有两个mongo聚合查询,它们分别工作得很好- db.transfer_orders.aggregate([ { $match: { "request_timestamp": { $gte: ISODate("2017-10-00T00:00:00.000Z") }, "request_timestamp": { $lt: ISODate("2017-10-12T00:00:00.000Z") },

我有两个mongo聚合查询,它们分别工作得很好-

   db.transfer_orders.aggregate([
    {
        $match: {
            "request_timestamp": { $gte: ISODate("2017-10-00T00:00:00.000Z") },
            "request_timestamp": { $lt: ISODate("2017-10-12T00:00:00.000Z") },
            "purpose": "POSITIONING"
        }
    },
    {
        $group: {
            _id: null,
            to_count: { $sum: 1 },
            qty: { $sum: "$quantity"  } 
        }  
    },
    {
    $project: {
      _id: 0,
      "to_count": "$to_count",
      "qty": "$qty"
    }
  }
])

第一个查询返回文档顶层元素的聚合数据,{“to_count”:7810,“qty”:19470}

第二个查询返回“adjustments”数组-{“adjustd_quantity”:-960}顶层下一层的元素聚合数据


有没有一种方法可以将其写入一个查询,该查询将返回两组数据,因为两组数据的匹配条件相同?

以下聚合操作应该足够了,因为它在引入新字段的
调整数量
步骤后有一个管道。可以使用返回每个文档的指定表达式列表的总和

一旦到达阶段,您可以使用操作符保留该值

db.transfer_orders.aggregate([
    {
        "$match": {
            "request_timestamp": { "$gte": ISODate("2017-10-00T00:00:00.000Z") },
            "request_timestamp": { "$lt": ISODate("2017-10-12T00:00:00.000Z") },
            "purpose": "POSITIONING"
        }
    },
    { 
        "$addFields": {
            "adjusted_quantity": {
                "$sum": "$adjustments.change_in_quantity"
            }    
        }
    },
    {
        "$group": {
            "_id": null,
            "to_count": { "$sum": 1 },
            "qty": { "$sum": "$quantity"  },
            "adjusted_quantity": { "$sum": "$adjusted_quantity" } 
        }  
    }
])

当我运行上面的查询-{u id:null,“to_count”:7810,“qty”:19470,“adjusted_quantity”:0}chridam-“adjusts”是一个数组,包含如下元素-`“adjusts”:[{“adjustment_id”:“113179”,“new_quantity”:0,“change_in_quantity”:-1,“created_by”:“WMS”,“event_timestamp”:ISODate(“2017-10-11T06:05:48.459Z”),“请求时间戳”:ISODate(“2017-10-11T06:05:48.459Z”),“发送到移动主题”:true,“发送尝试时间戳”:ISODate(“2017-10-11T06:05:48.459Z”),`所以我不认为“$sum”:“$adjustments.数量变化”是否能够在不使用$unwind的情况下对数组中的元素求和?将最后一个
“$first”
替换为
“$sum”
,它应该可以工作。好的,这样就可以了!为了让我了解这里发生了什么……第一个“$sum”:“$adjusts.change\u in\u quantity”将添加所有元素(调整数组中可以有多个元素),并将其作为字段添加到上一个$match阶段返回的每个文档中。然后,$group阶段的“调整的数量”:{“$sum”:“$adjusted的数量”}将汇总每个文档先前汇总的“变更数量”值。这是正确的吗?
db.transfer_orders.aggregate([
    {
        "$match": {
            "request_timestamp": { "$gte": ISODate("2017-10-00T00:00:00.000Z") },
            "request_timestamp": { "$lt": ISODate("2017-10-12T00:00:00.000Z") },
            "purpose": "POSITIONING"
        }
    },
    { 
        "$addFields": {
            "adjusted_quantity": {
                "$sum": "$adjustments.change_in_quantity"
            }    
        }
    },
    {
        "$group": {
            "_id": null,
            "to_count": { "$sum": 1 },
            "qty": { "$sum": "$quantity"  },
            "adjusted_quantity": { "$sum": "$adjusted_quantity" } 
        }  
    }
])