2015-05-29 191 views
0

我想重構一箇舊的php/mongo代碼以使用MongoDB's聚合功能。 現在,我正在做很多查詢來提取數據,如我所願。Mongo聚合多個不同

這是文檔模型:

{ 
    "_id" : ObjectId("548eb89c7a9a83fc0000002c"), 
    "session" : "870922750", 
    "id_category" : 1118, 
    "id_subcategory" : 2453, 
    "date_created" : ISODate("2014-12-15T12:31:55Z") 
} 

而且,我需要通過不同的session場,並通過每天subcategory計數彙總數據。 據我能想到的,回報應該是這樣的:

id_subcategory 
days 
    day 
    count (distinct session) 

    day 
    count (distinct session) 

我看了一下$push$addtoset,但我想我想念聚集是如何工作的大局?

謝謝!

+0

你的輸出產生了一些混亂,因爲按我的理解,你應該要明顯'id_subcategory'和組的所有'不同會話一天wise'? – Yogesh

+0

你把它放在比我好的話:) – kleampa

回答

0

按我的理解,我創建了一些樣本數據集如下:

db.collectionName.insert([{"session" : "870922750", "id_category" : 1118, "id_subcategory" : 2453, "date_created" : ISODate("2014-12-15T12:31:55Z") }, 
{"session" : "870922750", "id_category" : 1118, "id_subcategory" : 2453, "date_created" : ISODate("2014-12-15T12:31:55Z") }, 
{"session" : "870922750", "id_category" : 1118, "id_subcategory" : 2453, "date_created" : ISODate("2014-12-16T12:31:55Z") }, 
{"session" : "870922751", "id_category" : 1118, "id_subcategory" : 2453, "date_created" : ISODate("2014-12-16T12:31:55Z") }, 
{"session" : "870922751", "id_category" : 1118, "id_subcategory" : 2454, "date_created" : ISODate("2014-12-16T12:31:55Z") }]) 

使用mong aggregation和每個數據集date_createdISODate從這個ISODate找出給定dateday因此,找出日常使用$dayOfMonth彙總$project

聚集查詢爲:

db.collectionName.aggregate({ 
    "$project": { 
    "id_subcategory": 1, 
    "session": 1, 
    "day": { 
     "$dayOfMonth": "$date_created" //find day of given ISODate 
    } 
    } 
}, { 
    "$group": { 
    "_id": { 
     "subCategory": "$id_subcategory", //groups subCategory, session and day 
     "session": "$session", 
     "day": "$day" 
    }, 
    "count": { 
     "$sum": 1 
    } 
    } 
}, { 
    "$group": //this groups required to combining data 
    { 
    "_id": "$_id.subCategory", 
    "days": { 
     "$push": { 
     "day": "$_id.day", 
     "count": "$count", 
     "session": "$_id.session" 
     } 
    } 
    } 
}).pretty() 
+0

是的,就是這樣。 我看到$ project,$ group ....的順序非常重要,因爲我以其他順序測試它,並且出現關於「無法從bson轉換」的奇怪錯誤等。感謝man的快速回答。 – kleampa

+0

我有什麼指標可以獲得最佳性能?不包括$ match – kleampa

+0

更好的方法來在'date_created'字段上創建索引 – Yogesh