我正在使用mongodb,我以这种方式将datetime存储在我的数据库中
约会"17-11-2011 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})
谁知道怎么做这个查询?
日期以其时间戳格式存储.如果您想要属于特定月份的所有内容,请查询该月的开始和结束.
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/
您无法通过日期或月份等日期组件直接查询mongodb集合.但它可能通过使用特殊的$ where javascript表达式
db.mydatabase.mycollection.find({$where : function() { return this.date.getMonth() == 11} })
或者干脆
db.mydatabase.mycollection.find({$where : 'return this.date.getMonth() == 11'})
(但我更喜欢第一个)
查看以下shell命令以获取日期部分
>date = ISODate("2011-09-25T10:12:34Z") > date.getYear() 111 > date.getMonth() 8 > date.getdate() 25
编辑:
只有在没有其他选择的情况下才使用$ where.它带来了性能问题.请查看@kamaradclimber和@dcrosta的以下评论.我会让这篇文章公开,以便其他人了解相关事实.
并查看链接$ where查询中的子句和函数以获取更多信息
如何将月份存储在自己的属性中,因为您需要查询它?不太优雅$where
,但可能表现更好,因为它可以被索引.
如果要搜索属于特定月份的文档,请确保查询如下:
// Anything greater than this month and less than the next month db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 7, 1)}});
避免尽可能多地在下面查询.
// This may not find document with date as the last date of the month db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lt: new Date(2015, 6, 30)}}); // don't do this too db.posts.find({created_on: {$gte: new Date(2015, 6, 1), $lte: new Date(2015, 6, 30)}});