MongoDB找到今天的记录

时间:2017-02-25 13:00:25

标签: mongodb

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

2 个答案:

答案 0 :(得分:3)

我们可以使用$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也被编入索引。

答案 1 :(得分: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)
                  } 
           }
    );