按月、日、年查询Mongodb中的日期时间

56 投票
7 回答
133538 浏览
提问于 2025-04-17 06:21

我在使用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/

撰写回答