MongoDB和PyMongo - 从给定的日期和时间搜索文档

时间:2015-01-08 00:11:04

标签: mongodb python-2.7 pymongo isodate

我一直在研究这个问题,但我怀疑我并不了解正确的做法。

我试图从给定的日期和时间中查找集合中的所有数据。

日期和时间以ISO日期格式存储。 例如:ISODate(" 2015-01-07T23:39:000Z")

以下命令在MongoDB shell中起作用:

db.sensors.find({ "Date" : { "$gte" : ISODate("2014-12-31T02:15:00Z") }})

但是,我无法在Python中使用它。 看起来MongoDB期待完整的ISODate格式:ISODate(" 2014-01-07T23:39:000Z")。如果我只是给它一个没有ISODate的日期("")它就不会返回任何东西。

我创建了一个变量并转义了引号。这打印得很完美,但是当我尝试在创建光标时使用它时,它也包含了转义字符!

因此,我在创建游标对象时尝试转义引号。我没有运气这样做,但我不认为我走的是正确的轨道。似乎不太可能每当有人需要搜索特定日期和时间的记录时,他们就需要跳过这些环节。你能告诉我这里我做错了什么吗?下面,我列举了一些我尝试过的例子。在下面,我展示了当我描述MongoDB以查看Python传递给它时所提供的输出。最后,我表明我之前使用PHP工作,但出于各种原因,我不再使用PHP了。

date1 = datetime.datetime.utcnow()-datetime.timedelta(minutes=15)
date1 = date1.strftime("%Y-%m-%dT%H:%M:%S.000Z")
for cursor in sensors.find({'Date':{"$gte":'ISODate("'date1')"'}}):

第一行是定义日期和时间减去15分钟。 第二行是将其转换为正确的格式。 第三行是创建游标并添加ISODate("")组件。

下一个例子:

date1 = datetime.datetime.utcnow()-datetime.timedelta(minutes=15)
date1 = date1.strftime("%Y-%m-%dT%H:%M:%S.000Z")
for cursor in  sensors.find({'Date':{"$gte":date1}}):

第一行和第二行正在做同样的事情。 第三行是创建游标但不是实际添加ISODate组件。

这是第三行的另一个例子。再次,你可以看到我试图逃避报价。

date1 = 'ISODate(\"' + date1 + '\")'

有关在MongoDB中启用和使用性能分析的信息。 http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/#DatabaseProfiler-EnablingProfiling

db.setProfilingLevel(2) // Turn on verbose profiling. 
db.setProfilingLevel(0)  // Turn off profiling. 
db.system.profile.find()  // Show the contents of the profile collection. 

我看到其他人一直在检索两个给定日期和时间段的数据,但我无法遵循这些代码。 Retrieve data from mongodb based on date condition in pymongo

这是我写的一篇博文,当时我终于用PHP工作了。 http://www.digitaldarragh.com/2014/02/27/using-date-ranges-in-mongodb-and-php/

任何建议都非常欢迎。

很抱歉这个问题很长,但我认为最好先解释一下,并表明我已经花了很多时间研究这个问题,然后才开始在论坛上提问。

2 个答案:

答案 0 :(得分:1)

ISODate只是一个MongoDB shell构造,用于表示MongoDB日期和时间数据。该数据作为BSON Date数据类型存储在集合文档中,该数据类型是自Unix纪元以来毫秒数的64位整数计数。

在查询这些BSON日期字段时,您使用该语言的本机日期时间数据类型,而不是字符串。因此,在您的pymongo案例中,您将date1留作datetime,它只是:

date1 = datetime.datetime.utcnow()-datetime.timedelta(minutes=15)
for cursor in sensors.find({'Date':{"$gte": date1}}):
    ...

答案 1 :(得分:0)

使用dateutil解析你的日期,然后你可以查询mongo:

import dateutil.parser
import pymongo

db = pymongo.MongoClient()

mydate = dateutil.parser.parse("2014-12-31T02:15:00Z")

db.database.collection.find({"Date":mydate})