MongoDB文档示例如下:
{
"_id" : ObjectId("5f2df113bdde22f1043g45gg"),
"cd" : 1395376406,
"dob" : 552026006,
"e" : "test@gmail.com",
"g" : "M"
}
我需要使用dob(出生日期)字段(时间戳)查询今天的生日列表。
提前致谢!
答案 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
字段允许的功能和操作。查询变得更容易和更好。