您好,我有一个数据库(MongoDB),其中包含许多以毫秒为单位的日期条目。我想提取所有日期在早上 6:00 到 10:00 之间的条目我该怎么做?是否可以在单个查询中完成?例如,像这样的东西在 Tue Jul 17 2012 14:09:05 之前提取所有条目
db.OBSERVABLEPARAMETER.find({startDate:{$lte:1342526945150}})
您好,我有一个数据库(MongoDB),其中包含许多以毫秒为单位的日期条目。我想提取所有日期在早上 6:00 到 10:00 之间的条目我该怎么做?是否可以在单个查询中完成?例如,像这样的东西在 Tue Jul 17 2012 14:09:05 之前提取所有条目
db.OBSERVABLEPARAMETER.find({startDate:{$lte:1342526945150}})
与 $lte-operator 类似,还有$gte (greater-than-or-equal) operator。两者都可以组合在同一个对象中:
db.OBSERVABLEPARAMETER.find({startDate:{$gte:1342560000000, $lte:1342570000000}})
(值不是特定的时间戳,它们只是为了说明这个概念)
这使您可以获取特定时间范围内的所有数据。但是,当您想在任何一天获取特定时间段内的所有数据时,对于您和数据库来说,它都会变得更加复杂。这样一个复杂的查询需要一个带有 javascript 函数的$where 运算符,该函数从时间戳中提取小时数,并在它们介于 6 到 10 之间时返回 true。
顺便说一句:在 MongoDB 中存储日期的推荐方法是使用 Date 类型。不鼓励使用整数时间戳。请参阅http://docs.mongodb.org/manual/core/document/#document-bson-type-considerations
我无法使用 javascript 构建查询,我通过网页上的 php 脚本解决了以这种方式查询 MongoDB 的问题(此函数计算插入字段名称为“glicemia”的对象的平均小时数):
public function count_glicemie_momento_media($momento){
try{
// access collection
$collection = $this->db->OBSERVABLEPARAMETER;
// execute query
// retrieve all documents
$cursor = $collection->find(array( "parameter_name" => "glicemia","measuredValue2"=>$momento, "status" => array('$ne' => "DELETE")));
$sum=0;
foreach($cursor as $glicemia){
$sum+=date("G", $glicemia["startDate"]/1000);
}
return round($sum/$cursor->count(),2);
} catch (MongoConnectionException $e) {
die('Error connecting to MongoDB server');
} catch (MongoException $e) {
die('Error: ' . $e->getMessage());
}
return -1;
}