2017-02-25 85 views
2

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

+1

@cubbuk我认为' $哪里'那个日子还没有实现mongo shell。 – thanasisp

+1

@thanasisp $其中需要表扫描,因为它需要评估每个记录上的表达式,因此表现低下 – cubbuk

+0

@cubbuk当然它的确如此。 – thanasisp

回答

2

我们可以使用$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

所以从今天得到所有的记录:

var startOfToday = new Date(); 
start.setHours(0,0,0,0); 
// creates ObjectId() from date: 
var _id = Math.floor(startOfToday.getTime()/1000).toString(16) + "0000000000000000"; 

> db.collection("records") 
    .find({ _id: { $gt: _id } }); 

为了从给定的时间段中的所有记录(例如:昨天):

var yesterdayStart = new Date(); 
var yesterdayEnd = new Date(); 

yesterdayStart.setDate(dat.getDate() - 1); 
yesterdayEnd.setDate(dat.getDate() - 1); 

yesterdayStart.setHours(0,0,0,0); 
yesterdayStart.setHours(23,59,59,999); 

var startId = Math.floor(yesterdayStart.getTime()/1000).toString(16) + "0000000000000000"; 
var endId = Math.floor(yesterdayEnd.getTime()/1000).toString(16) + "0000000000000000"; 

> db.collection("records") 
    .find({ _id: { 
        $gt: startId, 
        $lt: endId 
        } 
      } 
    );