0

現在、次のようなmysqlテーブルがあります。

+---------+----------+------+-----+---------+----------------+
| Field   | Type     | Null | Key | Default | Extra          |
+---------+----------+------+-----+---------+----------------+
| id      | int(11)  | NO   | PRI | NULL    | auto_increment |
| mediaID | int(11)  | NO   |     | NULL    |                |
| date    | datetime | NO   |     | NULL    |                |
+---------+----------+------+-----+---------+----------------+

このテーブルには、特定のメディアに対して作成されたすべてのヒットが保存されます。このヒットが発生したときのメディア ID と日付を保存します。そのため、トレンド メディア (特定の期間に最も多く閲覧されたメディア) を表示したい場合は、次の 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 で動作できるようにする方法です。PS私はphp mongodbドライバーでphpを使用しています。

こんにちは、ミレン

4

2 に答える 2

2

集約フレームワークを使用します。過去 24 時間のヒットのみをカウントし、それらを mediaID でグループ化し、上位から下位へと並べて上位 10 を表示したいと考えていますか?

シェル内:

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
}
于 2012-10-20T21:23:31.917 に答える
0

ちょうど別のアドバイス。

で使用intmediaIDますmediaIDが、mongodbでのデータはを使用しているため、に保存する前にstringを使用intval()してデータを変換する必要がありますmediaID

stringの代わりに使用すると、いくつかの問題(例:比較)がありますintMongoDB-Queryでキャストすることは可能ですか?

于 2012-10-21T19:00:02.167 に答える