根据日期返回查询


208

我在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??}),以便它从数据库返回上述数据结果给我?


提到您使用的是哪个nodejs库本来会很有效,但是基于该示例,它似乎像其
mongoosejs

Answers:


420

您可能想进行范围查询,例如,给定日期之后创建的所有项目:

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") });

14
啊:)我以为你在用Mongo控制台。那里ISODate是js Date对象的包装器。尝试类似的东西"createdAt" : new Date("2010-01-01")。出于某种原因,该代码确实没有在蒙戈控制台作品(诉2.0.2),但是。
mnemosyn 2012年

日期初始化会使用斜杠而不是破折号吗?像这样:new Date("2010/01/01");
Victor S

16

如果要在该日期的任何地方获取商品,则需要比较两个日期

您可以像这样第一个创建两个日期,以获取一天的开始和结束时间。

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)

16

刚刚使用Node v0.12.7和v4.4.4在Mongo v3.2.3中实现了类似的功能,并使用了:

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

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


12

如果您想在过去5分钟内获得所有新鲜事物,则必须进行一些计算,但这并不难...

首先在要匹配的属性上创建索引(包括排序方向-1表示降序,1表示升序)

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

然后查询最近5分钟(60秒* 5分钟)内创建的文档...。因为javascript的.getTime()返回毫秒数,您需要将其乘以1000才能将其用作new Date()构造函数的输入。

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几秒钟即可轻松更改。我可以更改51202小时(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

当然,如果您使用的是node-mongodb-native驱动程序,那么使用变量会更容易一些,但这在mongo shell中有效,这是我通常用来检查事物的东西。


1
我想你可以使用Date.now(),而不是new Date().getTime()
贝朗杰


2

如果您使用猫鼬,

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}

1

查找特定日期:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

寻找更多gte或更少lt

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

按范围查找:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.