Mongodb 如何在一个mongo查询中获得顶级元素和一个低级数组元素的聚合?
我有两个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") },
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" }
}
}
])