MongoDB中的聚合框架结合小组和项目
问题描述:
我的文件看起来是这样的:MongoDB中的聚合框架结合小组和项目
db.hourly.aggregate([
{$match: {timestamp : "2016-05-28"}},
{$unwind: "$price_information.hourly_rates"},
{$group: { _id: "$unique_item_identifier", total_price: { $avg: "$price_information.hourly_rates.price"}}}
]);
我与引进(投影)奋力其他PARAMS:
{
"_id" : ObjectId("5748d1e2498ea908d588b65e"),
"some_item" : {
"_id" : ObjectId("5693afb1b49eb7d5ed97de14"),
"item_property_1" : 1.0,
"item_property_2" : 2.0,
},
"timestamp" : "2016-05-28",
"price_information" : {
"arbitrary_value" : 111,
"hourly_rates" : [
{
"price" : 74.45,
"hour" : "0"
},
{
"price" : 74.45,
"hour" : "1"
},
{
"price" : 74.45,
"hour" : "2"
},
]
}
}
我做了平均通过每天的价格在结果集中。我想在结果集中也有some_item
和timestamp
。我试图在查询中使用$project: {some_item: 1, total_price: 1, ...}
,但那是不对的。
我所需的输出会是这样:
{
"_id" : ObjectId("5693afb1b49eb7d5ed97de27"),
"someItem" : {
"_id" : ObjectId("5693afb1b49eb7d5ed97de14"),
"item_property_1" : 1.0,
"item_property_2" : 2.0,
},
"timestamp" : "2016-05-28",
"price_information" : {
"avg_price": 34
}
}
如果有人可以给我一个提示,如何对项目的分组和其他PARAMS到结果集,我将感谢。
最佳 罗布
答
要包括其他领域,包括在分组中的$first
操作:
db.hourly.aggregate([
{ "$match": { "timestamp": "2016-05-28" } },
{ "$unwind": "$price_information.hourly_rates" },
{
"$group": {
"_id": "$_id",
"avg_price": { "$avg": "$price_information.hourly_rates.price" },
"someItem": { "$first": "$some_item" },
"timestamp": { "$first": "$timestamp" },
}
},
{
"$project": {
"price_information": { "avg_price": "$avg_price" },
"someItem": 1
"timestamp": 1
}
}
]);
注意:在该$first
运营商的用法$group
阶段将很大程度上取决于如何获取该管道中的文档以及按键排序。因为$first
意愿返回的一组由密钥共享同一组的文件中的第一个文档值时,$group
阶段逻辑应先于一个$sort
阶段为具有在确定的顺序输入文档。这是唯一明智的,当你知道数据在被处理的顺序使用。
然而,正如上述由主文档_id
键时,适用于非规格化场(分组,$first
运营商而不是平坦的price_information
数组字段)将保证结果中的原始值。因此,不需要预先分拣阶段来定义订单,因为在这种情况下它不是必需的。
非常感谢!很高兴知道,我必须将其纳入其中。我不会那样做的! –