【问题标题】:return query based on date根据日期返回查询
【发布时间】:2012-02-08 18:46:09
【问题描述】:

我在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??}),使其从db返回上述数据结果给我?

【问题讨论】:

  • 提及您使用的是哪个nodejs库会很有效,但根据示例,它似乎是它的mongoosejs

标签: mongodb


【解决方案1】:

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

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

【讨论】:

  • 啊 :) 我以为您使用的是 Mongo 控制台。在那里,ISODate 是 js Date 对象的包装器。试试"createdAt" : new Date("2010-01-01") 之类的东西。但是,出于某种原因,该代码在 Mongo 控制台中工作(对于 v. 2.0.2)。
  • 日期初始化会使用斜杠而不是破折号吗?像这样:new Date("2010/01/01");
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果您想在该日期的任何地方获取项目,您需要比较两个日期

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

    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)
    

    【讨论】:

      【解决方案4】:

      如果您想在过去 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 秒,因此很容易更改。如果我想要 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

      当然,如果您使用的是 node-mongodb-native 驱动程序,使用变量会更容易一些,但这适用于我通常用来检查的 mongo shell。

      【讨论】:

      • 我觉得你可以用Date.now()代替new Date().getTime()
      【解决方案5】:

      查找特定日期:

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

      【讨论】:

        【解决方案6】:

        你也可以试试:

        {
            "dateProp": { $gt: new Date('06/15/2016').getTime() }
        }
        

        【讨论】:

          【解决方案7】:

          如果您使用的是 Mongoose,

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

          【讨论】:

            【解决方案8】:

            如果要从日期时间获取记录,可以使用以下方法:

            (mongodbCompass 3.6.8 与 PyMongo)

            mongo.db.collection.aggregate([{"$match":{"object.object.key":{"$gte":ISODate('2021-01-27T00:00:00Z').toISOString()}}}])
            
            db.collection.find({"object.object.key":{"$gte":ISODate('2021-01-27T00:00:00Z').toISOString()}})
            

            【讨论】:

              猜你喜欢
              • 2021-05-21
              • 2022-11-14
              • 1970-01-01
              • 2020-04-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多