我的数据在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)
)
);
任何可以帮助我的人?
答案 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 }
}}
])
但是根据您目前的日期格式,范围将成为一个问题。所以最好尽可能转换。