MongoDB 和 PyMongo - 从给定日期和时间搜索文档
MongoDB and PyMongo - Searching for documents from a given date and time
我已经为此工作了一段时间,但我怀疑我不明白正确的做法。
我正在尝试从给定日期和时间查找集合中的所有数据。
日期和时间以 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("") 的日期,它不会 return 任何东西。
我创建了一个变量并转义了引号。这打印得很好,但是当我尝试在创建光标时使用它时,它也包含转义字符!
所以,我在创建游标对象时试图转义引号。我没有运气这样做,但我不认为我走在正确的轨道上。似乎不太可能每次有人需要搜索特定日期和时间的记录时,他们都需要跳过这些步骤。你能告诉我我在这里做错了什么吗?下面,我列出了一些我尝试过的示例。在此之下,我显示了在我分析 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 终于开始工作时写的一篇博客 post。
http://www.digitaldarragh.com/2014/02/27/using-date-ranges-in-mongodb-and-php/
非常欢迎任何建议。
抱歉问了这么长的问题,但我认为最好解释清楚并表明我在求助于论坛提问之前已经花时间研究了这个问题。
用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})
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}}):
...
我已经为此工作了一段时间,但我怀疑我不明白正确的做法。
我正在尝试从给定日期和时间查找集合中的所有数据。
日期和时间以 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("") 的日期,它不会 return 任何东西。
我创建了一个变量并转义了引号。这打印得很好,但是当我尝试在创建光标时使用它时,它也包含转义字符!
所以,我在创建游标对象时试图转义引号。我没有运气这样做,但我不认为我走在正确的轨道上。似乎不太可能每次有人需要搜索特定日期和时间的记录时,他们都需要跳过这些步骤。你能告诉我我在这里做错了什么吗?下面,我列出了一些我尝试过的示例。在此之下,我显示了在我分析 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 终于开始工作时写的一篇博客 post。 http://www.digitaldarragh.com/2014/02/27/using-date-ranges-in-mongodb-and-php/
非常欢迎任何建议。
抱歉问了这么长的问题,但我认为最好解释清楚并表明我在求助于论坛提问之前已经花时间研究了这个问题。
用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})
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}}):
...