2013-05-08 231 views
0

您好,我有一个数据库(MongoDB),其中有许多日期以毫秒为单位的条目。 我想提取早上6:00到10:00之间的所有日期条目 我该怎么做?是否可以在单个查询中完成? 这样的事情星期二2012年7月17日14时09分05秒之前提取所有条目例如筛选日期以毫秒为单位

db.OBSERVABLEPARAMETER.find({startDate:{$lte:1342526945150}}) 
+0

你只是想记录回来,还是想对每天的记录进行一些分析? – 2013-05-08 17:37:00

回答

1

模拟到$ LTE运营商也有个$gte (greater-than-or-equal) operator。两者都可以在同一个对象组合:

db.OBSERVABLEPARAMETER.find({startDate:{$gte:1342560000000, $lte:1342570000000}})

(值不特定的时间戳,他们只是为了说明这个概念)

这可以让你获得一个特定的时间范围内的所有数据。但是,如果您希望在特定时间段内的所有数据在任何日期为,那么对于您和数据库来说都会变得更加复杂。这样一个复杂的查询需要一个带有javascript函数的$where operator,该函数从时间戳中提取小时,并在6到10之间返回true。

顺便说一句:在MongoDB中存储日期的推荐方式是使用日期类型。不鼓励使用整数时间戳。请参阅http://docs.mongodb.org/manual/core/document/#document-bson-type-considerations

+0

不幸的是,它不是我设计的分贝,我只需要对它做一些分析,我所有的都是毫秒......所以我需要直接在查询中放入一个javascript函数,该函数返回自毫秒以来的一天的小时数1970年1月1日? – Mark 2013-05-08 09:50:46

+1

@Mark是的。在$ where函数中''var hours = new Date(this.startDate).getHours()'应该可以获得小时部分,但我现在无法对其进行测试。 – Philipp 2013-05-08 09:52:44

0

我无法使用javascript构建查询,我使用php脚本在以这种方式查询MongoDB的网页上解决(此函数计算插入字段名为“glicemia”的对象的平均小时数) at):

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; 
    } 
相关问题