查询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的$redactpipe道:

 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道中丢弃那些与使用$$PRUNEvariables不匹配的文档。