按月、日、年查询Mongodb中的日期时间
我在使用mongodb这个数据库,我把日期和时间存储成这样
比如说日期是“2011年11月17日 18:00”,我存的是:
date = datetime.datetime(2011, 11, 17, 18, 0)
db.mydatabase.mycollection.insert({"date" : date})
我想要发一个这样的请求
month = 11
db.mydatabase.mycollection.find({"date.month" : month})
或者
day = 17
db.mydatabase.mycollection.find({"date.day" : day})
有没有人知道怎么做这个查询?
7 个回答
13
你可以考虑把月份单独存储在一个属性里,因为你需要根据它来查询。虽然这样做没有使用$where
那么优雅,但可能会更有效率,因为它可以被索引。
34
你不能直接通过日期的组成部分,比如天或月,来查询mongodb的集合。不过,可以使用一个特殊的$where的javascript表达式来实现。
db.mydatabase.mycollection.find({$where : function() { return this.date.getMonth() == 11} })
或者简单地说
db.mydatabase.mycollection.find({$where : 'return this.date.getMonth() == 11'})
(但我更喜欢第一种方法)
下面是一些命令行的例子,可以用来获取日期的各个部分。
>date = ISODate("2011-09-25T10:12:34Z")
> date.getYear()
111
> date.getMonth()
8
> date.getdate()
25
编辑:
只有在没有其他选择的情况下才使用$where。这可能会影响性能。请查看@kamaradclimber和@dcrosta的评论。我会保持这个帖子开放,让其他人了解相关信息。
另外,可以查看这个链接 $where子句和查询中的函数,获取更多信息。
63
日期是以时间戳的格式存储的。如果你想获取某个月的所有内容,可以查询这个月的开始和结束时间。
var start = new Date(2010, 11, 1);
var end = new Date(2010, 11, 30);
db.posts.find({created_on: {$gte: start, $lt: end}});
//taken from http://cookbook.mongodb.org/patterns/date_range/