使用php将mysql查询转换为mongodb

时间:2012-10-20 11:10:03

标签: php mongodb

目前我有一个像这样的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驱动程序。

问候, 米伦

2 个答案:

答案 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)

只是另一个建议。

由于intmediaID一起使用,但mongodb中mediaID的数据使用string,您应使用intval()转换数据在将其存储到mediaID之前。

如果您使用string而不是int,则存在一些问题(例如:比较)。 Is it possible to cast in a MongoDB-Query?