查询从mongodb获取时间计数

时间:2014-03-27 06:28:26

标签: php mongodb aggregation-framework

我的数据在mongodb数据库中为

{
   "_id": ObjectId("5319acf0b06f6e98371ca505"),
   "field1": "",
   "date": "07-03-2014",
   "os": "android",
   "time": "11:26:40",
   "userid": "xxxx"
}   

我想要计算时间从00到23的所有记录。 我把我的查询写成

$time_start = date('00');
$time_end = date('23');
$keys = array("time" => 1);
$initial = array("counttime" => array());
$reduce = "function(obj, prev) {
    if (obj.time != null) 
        if (obj.time instanceof Array) prev.counttime += obj.time.length;
        else prev.counttime++;  }";     
$condition = array(
    'condition' => array(
        "time" => array(
            '$gt' => $time_start,
            '$lte' => $time_end 
        )
     )
);

$g = $collection->group($keys, $initial, $reduce , $condition);`

我试过要小时但那不适合我。 我用过

$condition = array(
    'condition' => array(
        "HOUR(time)" => array(
            '$gt' => $time_start,'$lte' => $time_end)
        )
);

任何可以帮助我的人?​​

1 个答案:

答案 0 :(得分:1)

你可以使用.aggregate()执行此操作,在任何情况下你都应该优先使用.group(),因为它使用本机代码而不是JavaScript来获得结果:

db.collection.aggregate([
    // Match one date (tell you later)
    { "$match": { "date": "07-03-2014" } },

    // Project the hour
    { "$project": {
        "hour": { "$substr": [ "$time", 0, 2 ] }
    }},

    // Group on the hour
    { "$group": { 
        "_id": "$hour",
        "count": { "$sum": 1 }
    }}
])

现在这取决于您将“时间”存储为字符串。所以你$project那个“时间”的“小时”部分然后$group就可以了,保持记录的数量。

我将此限制为一个“日期”,因为与“时间”一样,这也是一个字符串。根据你想做的事情,你可能会得到意想不到的结果,所以一般来说,使用“字符串”表示日期并不是一个好主意。

如果您在名为“timestamp”的字段中只有一个合适的BSON日期,那么您可以执行以下操作,您甚至可以设置范围:

var start_date = new Date("2014-02-01");
var end_date = new Date("2014-03-01");

db.collection.aggregate([
    // Match on the date range
    { "$match": { "timestamp": { "$gte": start_date, "$lt": end_date } },

    // Project day and hour
    { "$project": {
        "day": {
            "year": { "$year": "$timestamp" },
            "month": { "$month": "$timestamp" },
            "day": { "$dayOfMonth": "$timestamp" },
            "hour": { "$hour": "$timestamp" }
        }
    }},

    // Group on the day
    { "$group": {
        "_id": "$day",
        "count": { "$sum": 1 }
    }}
])

但是根据您目前的日期格式,范围将成为一个问题。所以最好尽可能转换。