我正在使用节点0.10.21和mongodb-native(aka require('mongodb'))。
我遇到的问题是,我无法聚合时间序列集合并使用匹配来选择某个时间范围:
var start = new Date(); //just demo, the start date is actually lower than NOW()
var end = new Date(); // is usally NOW() in my queries
$match : [{'$match' : {'date' : {'$gte' : start, '$lte' : end}}}]
生成的查询(JSON.stringify(query);)如下所示:
{"$match":{"date":{"$gte":"2013-11-09T23:00:00.000Z","$lte":"2013-11-12T05:00:00.000Z"}}}
当然,我已经在http://mongodb.github.io/node-mongodb-native/api-articles/nodekoarticle1.html#mongo-db-data-types阅读了文档,文档说:
日期直接映射到Javascript日期
显然不是,或者我忽略了一些东西。我已经看到了关于这个问题的类似问题,但没有一个提供解决方案。
在MongoDB shell中,使用{date:{'$ gte':new Date(2013,10,25)}}一切正常 - 所以集合本身充满了我应该能够使用节点查询的有效数据。我也写了一个PHP脚本做同样类型的查询,它工作正常。因此我怀疑我误读了文档,或者mongodb-native驱动程序没有将JavaScript的Date()映射到MongoDB的Date()。
有人可以告诉我如何查询日期范围吗?
Update1:更多代码
根据JohnnyHK的要求,这里有一些我正在使用的代码。我已经删除了构建实际聚合值的代码 - 这些代码按预期工作,只有$ match部分让我感到头疼。
var start = new Date(start_date);
var end = new Date(end_date);
console.log(start,end);
//outputs: 2013-11-10 0:00 2013-11-12 6:00
var ops = [{'$match' : {'date' : { '$gte' : start, '$lte' : end} }}, {'$group' : group_values}];
console.log(JSON.stringify(ops));
//outputs: [{"$match":{"date":{"$gte":"2013-11-09T23:00:00.000Z","$lte":"2013-11-12T05:00:00.000Z"}}},{"$group":{"used":{"$avg":"$used"},"system":{"$avg":"$system"},"iowait":{"$avg":"$iowait"},"_id":{"group_id":{"$subtract":[{"$divide":["$timestamp",3600]},{"$mod":[{"$divide":["$timestamp",3600]},1]}]}}}}]
collection.aggregate(ops,function(err, results) {
console.log('mongo results');
console.log(arguments);
//output: mongo results
//{ '0': null, '1': [] }
});
UPDATE2
示例数据:
{ "date" : ISODate("2013-10-22T13:52:16Z"), "timestamp" : 1382449936, "used" : 743.7768451188878, "system" : 855.7432519109785, "iowait" : 0, "max" : 400, "_id" : ObjectId("5266831aacce8ec133bb11af") }
{ "date" : ISODate("2013-10-22T13:52:06Z"), "timestamp" : 1382449926, "used" : 758.1516303260652, "system" : 840.5681136227246, "iowait" : 0, "max" : 400, "_id" : ObjectId("5266831aacce8ec133bb11ae") }
{ "date" : ISODate("2013-10-22T13:51:56Z"), "timestamp" : 1382449916, "used" : 826.0163785417379, "system" : 765.362035769591, "iowait" : 1.9952086438206234, "max" : 400, "_id" : ObjectId("52668306acce8ec133bb10f7") }
{ "date" : ISODate("2013-10-22T13:51:46Z"), "timestamp" : 1382449906, "used" : 1079.9727415609912, "system" : 526.4513588679281, "iowait" : 0, "max" : 400, "_id" : ObjectId("52668306acce8ec133bb10f6") }
{ "date" : ISODate("2013-10-22T13:51:36Z"), "timestamp" : 1382449896, "used" : 1327.1878627467097, "system" : 273.2917036211522, "iowait" : 0, "max" : 400, "_id" : ObjectId("526682f2acce8ec133bb1043") }