0
我正在为几乎实时的统计模块创建数据库结构。我想统计不同产品的用户行为:新的喜欢,投票,新评论和总活动(总票数,喜欢等)。MongoDB中重叠日期的聚合查询
该模块需要在过去的8,16或24小时内发送最多的活动的 N产品。 我的第一个想法是为一个文件下面的模式:
{
"_id" : ObjectId("570e37d0db8c0897d651509c"),
"date" : "2016-04-13",
"trackId" : 35,
"count" : {
"hour_1" : {
"total" : 120,
"downVote" : 35,
"newComment" : 26,
"upVote" : 34,
"like" : 25
},
"hour_2" : {
"total" : 124,
"downVote" : 32,
"like" : 28,
"upVote" : 33,
"newComment" : 31
},
// ...
"hour_24" : {
"total" : 119,
"downVote" : 42,
"newComment" : 30,
"upVote" : 31,
"like" : 16
}
}
}
在这种情况下,我有X产品X文件在一天与此查询我什么,我需要快速维伊获取数据。
db.getCollection('HourlyStat')
.aggregate([
{$match: {date: '2016-04-13'}},
{
$project: {'trackId': "$trackId",
count: {
$sum: ["$count.hour_1.total", "$count.hour_2.total", ..., "$count.hour_8.total"] }
}
},
{$sort: {'count': -1}}, {$limit: 10}
])
不幸的是,这是不适用于包括两天的时间段。 例如:从2016-04-13 12:00:00
到2016-04-14 12:00:00
我可以为此编写一个查询,或者我应该更改我的数据结构吗?一个简单的解决方法是将小时数据存储在独立的文档中,但它将包含多达24倍的数据,而对于大量的产品,它可能会很慢。
好了,你就需要为每个时隙运行多个聚集查询,并在应用程序中合并返回文档的情况下。 – Saleem
@Saleem这不是一个可以接受的解决方案,因为在这种情况下,应用程序服务器需要处理大量的数据,消耗内存。 – Festo