根据日期返回查询

cou*_*011 177 mongodb

我在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") 
}
Run Code Online (Sandbox Code Playgroud)

我如何查询db.gpsdatas.find({'createdAt': ??what here??}),以便它从db返回上述数据结果?

mne*_*syn 364

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

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

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

如果你真的想找到一个等于另一个日期的日期,那么语法就是

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });
Run Code Online (Sandbox Code Playgroud)

  • 啊:)我以为你在使用Mongo控制台.在那里,`ISODate`是js Date对象的包装器.尝试类似`"createdAt":new Date("2010-01-01")`.出于某种原因,该代码在Mongo控制台中确实_not_工作(对于v.2.0.2). (14认同)

med*_*116 15

如果你想在那个日期的任何地方获得物品,你需要比较两个日期

您可以像这样创建第一个日期之外的两个日期,以获得当天的开始和一天结束.

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)
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 14

刚刚使用Node v0.12.7和v4.4.4在Mongo v3.2.3中实现类似的东西并使用:

{ $gte: new Date(dateVar).toISOString() }
Run Code Online (Sandbox Code Playgroud)

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


Ham*_*RIM 13

查找特定日期:

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

查找较大gte或较小的值lt

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

按范围查找:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Run Code Online (Sandbox Code Playgroud)


cho*_*ovy 11

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

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

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt
Run Code Online (Sandbox Code Playgroud)

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

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

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

首先我们计算"5分钟前":

  1. new Date().getTime() 以毫秒为单位给出当前时间
  2. 我们想从中减去5分钟(以毫秒为单位):5*60*1000- 我只是乘以60秒,因此很容易改变.我可以改变5120,如果我要2小时(120分钟).
  3. new Date().getTime()-60*5*1000给我们1484383878676(5分钟前在ms)

现在我们需要将它提供给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中使用,这是我通常用来检查的东西.

  • 我认为你可以使用`Date.now()` 而不是`new Date().getTime()` (2认同)

小智 6

您还可以尝试:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}
Run Code Online (Sandbox Code Playgroud)