【问题标题】:MongoDB find today's records [duplicate]MongoDB找到今天的记录[重复]
【发布时间】:2017-02-25 13:00:24
【问题描述】:

在 Mongo shell 中,我将如何过滤今天(或特定日期)添加的记录?我没有新记录的时间戳的特定字段,但我想它可以从 ObjectID 恢复。

【问题讨论】:

  • @cubbuk 我认为 $where 当时还没有为 mongo shell 实现。
  • @thanasisp $where 需要表扫描,因为它需要评估每条记录上的 where 表达式,因此性能低下
  • @cubbuk 当然可以。

标签: mongodb


【解决方案1】:

我们可以使用$where

db.collection.find(
   { $where: "this._id.getTimestamp() >= ISODate('2017-02-25')" }
)

要获取今天的文件,或者最好是从上个午夜开始:

db.collection.find( { $where: function() { 
    today = new Date(); //
    today.setHours(0,0,0,0);
    return (this._id.getTimestamp() >= today)
} } );

当然,拥有一个索引时间戳字段或按照该方法计算开始日期的 ObjectID 并将 _id 与它进行比较会快得多,因为 _id 也被索引了。

【讨论】:

    【解决方案2】:

    获取今天的所有记录:

    var startOfToday = new Date();
    startOfToday.setHours(0,0,0,0);
    // creates ObjectId() from date:
    var _id = Math.floor(startOfToday.getTime() / 1000).toString(16) + "0000000000000000";
    
    > db.collection("records")
        .find( { _id: { $gte: ObjectId(_id) } });
    

    获取给定时间段内的所有记录(例如:昨天):

    var yesterdayStart = new Date();
    yesterdayStart.setDate(yesterdayStart.getDate() - 1);
    yesterdayStart.setHours(0,0,0,0);
    var startId = Math.floor(yesterdayStart.getTime() / 1000).toString(16) + "0000000000000000";
    
    var yesterdayEnd = new Date();
    yesterdayEnd.setDate(yesterdayEnd.getDate() - 1);
    yesterdayEnd.setHours(23,59,59,999);
    var endId = Math.floor(yesterdayEnd.getTime() / 1000).toString(16) + "0000000000000000";
    
    > db.collection("records")
        .find( { _id: { 
                        $gte: ObjectId(startId),
                        $lte: ObjectId(endId)
                      } 
               }
        );
    

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2015-01-15
      • 1970-01-01
      相关资源
      最近更新 更多