2015-05-29 112 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