2016-05-31 104 views
3

我的文件看起来是这样的: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_itemtimestamp。我试图在查询中使用$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到结果集,我将感谢。

最佳 罗布

回答

4

要包括其他领域,包括在分组中的$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数组字段)将保证结果中的原始值。因此,不需要预先分拣阶段来定义订单,因为在这种情况下它不是必需的。

+1

非常感谢!很高兴知道,我必须将其纳入其中。我不会那样做的! –