查询Mongodb的date时间的月,日,年…
我正在使用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})
任何人都知道如何做这个查询?
date以时间戳格式存储。 如果您想要属于特定月份的所有内容,请查询月份的开始和结束时间。
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/
你不能按date或月份等date组件直接查询mongodb集合。 但它可能通过使用特殊的$ where JavaScriptexpression式
db.mydatabase.mycollection.find({$where : function() { return this.date.getMonth() == 11} })
或干脆
db.mydatabase.mycollection.find({$where : 'return this.date.getMonth() == 11'})
(但我更喜欢第一个)
查看下面的shell命令来获取date的部分
>date = ISODate("2011-09-25T10:12:34Z") > date.getYear() 111 > date.getMonth() 8 > date.getdate() 25
编辑:
只有在没有其他select的情况下,才使用$。 它带有性能问题。 请查看@kamaradclimber和@dcrosta的以下评论。 我会让这个post开放,让其他人得到有关它的事实。
并查看链接$ where查询中的子句和函数以获取更多信息
如何将月份存储在自己的属性,因为你需要查询它? 不如$where
优雅,但可能会更好,因为它可以被索引。
如果要search属于特定月份的文档,请确保按如下所示进行查询:
// 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)}});
尽可能避免像下面一样qu </s>。
// 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)}});
您可以按date聚合运营商按date ,月份,date,年份等查找logging,例如$ dayOfYear,$ dayOfWeek,$ month,$ year等。
作为一个例子,如果你想要在2016年4月创build的所有订单,你可以使用下面的查询。
db.getCollection('orders').aggregate( [ { $project: { doc: "$$ROOT", year: { $year: "$created" }, month: { $month: "$created" }, day: { $dayOfMonth: "$created" } } }, { $match : { "month" : 4, "year": 2016 } } ] )
这里创build的是文档中的datetypes字段,我们用$$ ROOT将所有其他字段传递给下一个阶段的项目,并给我们提供文档的所有细节。
您可以根据需要优化以上查询,只是举个例子。 要了解更多关于Date Aggregation Operators的信息,请访问链接 。
您可以使用MongoDB_DataObject包装来执行如下查询:
$model = new MongoDB_DataObject('orders'); $model->whereAdd('MONTH(created) = 4 AND YEAR(created) = 2016'); $model->find(); while ($model->fetch()) { var_dump($model); }
或者,类似地,使用直接查询string:
$model = new MongoDB_DataObject(); $model->query('SELECT * FROM orders WHERE MONTH(created) = 4 AND YEAR(created) = 2016'); while ($model->fetch()) { var_dump($model); }
您可以使用aggregate()
函数运行一个聚合操作,该函数接受在条件expression式中使用Date Aggregation Operators的$redact
pipe道:
var month = 11; db.collection.aggregate([ { "$redact": { "$cond": [ { "$eq": [ { "$month": "$createdAt" }, month ] }, "$$KEEP", "$$PRUNE" ] } } ])
对于其他请求
var day = 17; db.collection.aggregate([ { "$redact": { "$cond": [ { "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] }, "$$KEEP", "$$PRUNE" ] } } ])
使用OR
var month = 11, day = 17; db.collection.aggregate([ { "$redact": { "$cond": [ { "$or": [ { "$eq": [ { "$month": "$createdAt" }, month ] }, { "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] } ] }, "$$KEEP", "$$PRUNE" ] } } ])
使用AND
var month = 11, day = 17; db.collection.aggregate([ { "$redact": { "$cond": [ { "$and": [ { "$eq": [ { "$month": "$createdAt" }, month ] }, { "$eq": [ { "$dayOfMonth": "$createdAt" }, day ] } ] }, "$$KEEP", "$$PRUNE" ] } } ])
$redact
操作$match
并了$project
和$match
pipeline的function,并且将使用$$KEEP
返回所有文档匹配的条件,并从pipe道中丢弃那些与使用$$PRUNE
variables不匹配的文档。