查询MongoDB中的时间戳

时间:2014-11-20 04:16:04

标签: mongodb

MongoDB文档示例如下:

{
    "_id" : ObjectId("5f2df113bdde22f1043g45gg"),
    "cd" : 1395376406,
    "dob" : 552026006,
    "e" : "test@gmail.com",
    "g" : "M"   
}

我需要使用dob(出生日期)字段(时间戳)查询今天的生日列表。

提前致谢!

2 个答案:

答案 0 :(得分:1)

我不确定我的解决方案有多优雅,但它应该有效

var start = new Date();
start.setHours(0,0,0,0);

var end = new Date();
end.setHours(23,59,59,999);

db.collection.find({dob:{$gt:start.getTime(), $lt:end.getTime()}})

答案 1 :(得分:1)

由于MongoDb没有任何内置函数/操作来支持解析原始timestamps并从中提取信息,因此您需要通过将自定义Java脚本函数传递给服务器并在那里执行它。不过,这个函数将针对每个记录执行。

db.collection.find({$where:function(){
      var recDate = new Date(this.dob);
      var recDay = recDate.getDate();
      var recMonth = recDate.getMonth();

      var today = new Date();
      var todayDate = today.getDate();
      var todayMonth = today.getMonth();

    return (recDay == todayDate && recMonth == todayMonth);
}});

该功能只是检查今天和月的任何记录的日期和月份是否匹配。 虽然这适用于时间戳,但只要存储日期信息,就应该利用MongoDB ISODate数据类型。这使我们能够在这些领域使用各种运算符和函数。而且他们会更快。如果您的文档具有以下结构:

{
    "_id" : "1",
    "cd" : 1395376406,
    "dob" : ISODate("2014-11-19T08:00:00Z"),
    "e" : "test@gmail.com",
    "g" : "M"   
}

其中,dob字段为ISODate类型。您可以轻松执行aggregate操作来获取结果。

var todayDate = ISODate().getDate();
var todayMonth = ISODate().getMonth();

db.collection.aggregate([
{$project:{"day":{$dayOfMonth:"$dob"},
           "month":{$month:"$dob"},
           "_id":1,"cd":1,"dob":1,"e":1,"g":1}},
{$match:{"day":todayDate,"month":todayMonth}},
{$project:{"cd":1,"dob":1,"e":1,"g":1,"_id":1}}
])

上述操作利用ISODate字段允许的功能和操作。查询变得更容易和更好。