当前位置:  开发笔记 > 编程语言 > 正文

在日期时间的月,日,年...查询Mongodb

如何解决《在日期时间的月,日,年查询Mongodb》经验,为你挑选了4个好方法。

我正在使用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})

谁知道怎么做这个查询?



1> DrColossos..:

日期以其时间戳格式存储.如果您想要属于特定月份的所有内容,请查询该月的开始和结束.

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/


哇,这真是太糟糕了......如果你想在特定日期查询,你必须要注意月份和月末......月份可以有28,29,30或31天......为什么他们不能做出类似的事:日期:{$年:2014年,$月:4}?这不是查询语言,而是编程.
@DrColossos,还有另一种方法可以使用$ where来做到这一点

2> RameshVel..:

您无法通过日期或月份等日期组件直接查询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:它需要全局锁定.请参阅@DrColossos答案以获得更好的方法.
它本身不是一个锁,但是每个`mongod`实例只有一个javascript上下文,可以在其中执行任何javascript(`$ where`,map-reduce作业等).查询将定期生成,因此一个查询不会完全阻止另一个查询,但多个查询或其他javascript工作将会更慢.这就是为什么不推荐`$ where`的原因.

3> RubyTuesdayD..:

如何将月份存储在自己的属性中,因为您需要查询它?不太优雅$where,但可能表现更好,因为它可以被索引.



4> Ujjwal Ojha..:

如果要搜索属于特定月份的文档,请确保查询如下:

// 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)}});

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有