如何在一个mongo查询中聚合顶级元素以及一个级别向下数组元素?

时间:2017-11-12 14:20:07

标签: mongodb mongodb-query aggregation-framework

我有2个单独的mongo聚合查询 -

mainloop()

   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,"数量" :19470}

第二个查询返回顶层以下一个级别的元素的聚合数据,用于"调整" array - {" adjusted_quantity" :-960}

有没有办法将此写为一个将返回两组数据的查询,因为两者的匹配条件相同?

1 个答案:

答案 0 :(得分:1)

以下聚合操作应该足够了,因为它在引入新字段adjusted_quantity $match 步骤之后有一个管道。使用 $sum 可以实现这一点,它返回每个文档的指定表达式列表的总和。

一旦到达 $group 阶段,您就可以使用 $sum 运算符保留该值。

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" } 
        }  
    }
])