2016-05-31 195 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

非常感謝!很高興知道,我必須將其納入其中。我不會那樣做的! –