2012-01-12 60 views
110

我在MongoDB中像这样的数据返回查询基于日期

{ "latitude" : "", "longitude" : "", "course" : "", "battery" : "0", "imei" : "0", "altitude" : "F:3.82V", "mcc" : "07", "mnc" : "007B", "lac" : "2A83", "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), "createdAt" : ISODate("2012-01-12T20:15:31Z") } 

如何查询db.gpsdatas.find({'createdAt': ??what here??}),使其返回我从分贝以上的结果?

回答

237

你可能想使一个范围查询,例如,一个给定的日期之后创建的所有项目:

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }}); 

我使用$gte(大于或等于),因为这是通常用于日期 - 仅查询,其中时间组件是00:00:00。

如果你真的想找到一个等于另一个日期的日期,语法将

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") }); 
+0

出错:ISODate未定义。 – coure2011 2012-01-13 06:36:06

+0

您使用的是哪个版本? – mnemosyn 2012-01-13 09:17:04

+0

node.js是v0.4.8 – coure2011 2012-01-13 09:25:42

12

如果你想获得的项目上,你需要比较两个日期

可以在该日期的任何地方创建两个像这样的第一个日期,以获得一天的开始和一天的结束。

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z") 

startDate.setSeconds(0); 
startDate.setHours(0); 
startDate.setMinutes(0); 

var dateMidnight = new Date(startDate); 
dateMidnight.setHours(23); 
dateMidnight.setMinutes(59); 
dateMidnight.setSeconds(59); 

### MONGO QUERY 

var query = { 
     inserted_at: { 
        $gt:morning, 
        $lt:dateScrapedMidnight 
     } 
}; 

//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT) 
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT) 
8

使用节点v0.12.7和v4.4.4和使用只是实现了在蒙戈V3.2.3类似的东西:

{ $gte: new Date(dateVar).toISOString() } 

我传递一个ISODate(如2016-04-22T00 :00:00Z),这适用于带或不带toISOString函数的.find()查询。但是,在.aggregate()$ match查询中使用它时,它不喜欢toISOString函数!

3

您也可以尝试 "dateProp": {$gt: new Date('06/15/2016').getTime() }

5

如果你想在过去5分钟所有新的东西,你就必须做一些计算,但它并不难......

首先创建一个索引你想匹配的财产(包括升序排序方向-1下降和1)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt 

然后在最后5分钟创建的文档查询(60秒* 5分钟)....因为javascript的.getTime()在将它用作new Date()构造函数的输入之前返回需要多达1000的毫秒数。

db.things.find({ 
     createdAt: { 
      $gte: new Date(new Date().getTime()-60*5*1000).toISOString() 
     } 
    }) 
    .count() 

解释new Date(new Date().getTime()-60*5*1000).toISOString()如下:

首先,我们计算出 “5分钟前”:

  1. new Date().getTime()给我们以毫秒为单位的当前时间
  2. 我们要减去5分钟(以毫秒为单位):5*60*1000 - 我只是乘以60秒,所以很容易改变。如果我想要2小时(120分钟),我可以将5更改为120
  3. new Date().getTime()-60*5*1000给我们1484383878676(5分钟前以毫秒为单位)

现在我们需要养活的是成new Date()构造度日的MongoDB时间戳所需的ISO字符串格式。

  1. { $gte: new Date(resultFromAbove).toISOString() }(MongoDB的.find()查询)
  2. 既然我们不能有两个变量,我们做这一切在一杆:new Date(new Date().getTime()-60*5*1000)
  3. ...然后转换为ISO字符串:.toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString()给我们2017-01-14T08:53:17.586Z

当然,这是如果你使用的节点MongoDB的原生驱动变量更容易一些,但这部作品在周一去壳这是我通常用来检查的东西。

+0

我认为你可以使用'Date.now()'而不是'new Date()。getTime()' – 2017-06-19 12:25:20