目前我有一个像这样的mysql表:
+---------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| mediaID | int(11) | NO | | NULL | |
| date | datetime | NO | | NULL | |
+---------+----------+------+-----+---------+----------------+
在此表中,我存储了针对特定媒体所做的每一次点击。发生此命中时,我保存了mediaID和日期。所以......当我想要显示趋势媒体(特定时间段内查看最多的媒体)时,我使用这个mysql查询:
SELECT mediaID, COUNT(*) as cnt FROM hits WHERE DATE(date) = CURDATE() - INTERVAL 1 DAY GROUP BY mediaID ORDER BY cnt DESC LIMIT 0,10
现在..我打算在MongoDB中移动它。目前我收集了“点击”以及以下文件:
{
_id: ObjectId("50827eaaae1c3ced6c00000f"),
mediaID: "2",
ts: ISODate("2012-10-20T13:36:26+03:00")
}
{
_id: ObjectId("50827ebeae1c3ced6c000010"),
mediaID: "1",
ts: ISODate("2012-10-20T13:36:46+03:00")
}
{
_id: ObjectId("50827ec3ae1c3c6167000008"),
mediaID: "2",
ts: ISODate("2012-10-20T13:36:51+03:00")
}
那么,我的问题是如何转换我之前的查询以便能够使用MongoDB? 附:我正在使用PHP与php mongodb驱动程序。
问候, 米伦
答案 0 :(得分:2)
使用Aggregation Framework。您只想计算过去24小时内的点击次数,按照mediaID对它们进行分组,然后从最高到最低排序并显示前十名,对吗?
在shell中:
today = new Date();
// this gets you yesterday but you can change this to be any time period
cutoff = new Date(today.getYear(), today.getMonth(), today.getDate()-1);
db.hits.aggregate( [
{$match: {ts: {$gt: cutoff} } },
{$group: {_id: "$mediaID", cnt: {$sum: 1} } },
{$project: {mediaID: "$_id", cnt:1, _id:0 } },
{$sort: { cnt:-1 } },
{$limit: 10}
] )
您将收到您显示的示例数据:
{
"result" : [
{
"mediaID" : "2",
"cnt" : 2
},
{
"mediaID" : "1",
"cnt" : 1
}
],
"ok" : 1
}
答案 1 :(得分:0)
只是另一个建议。
由于int
与mediaID
一起使用,但mongodb中mediaID
的数据使用string
,您应使用intval()
转换数据在将其存储到mediaID
之前。
如果您使用string
而不是int
,则存在一些问题(例如:比较)。
Is it possible to cast in a MongoDB-Query?