使用 Python 查询 mongodb 集合的最佳方法是什么 3
What is the best way to query a mongodb collection using Python 3
首先,让我在这里解释一下项目问题:
我正在开发 Web 应用程序,使用库 CherryPy、PyMongo,数据库后端是 MongoDB数据库,我使用Python3作为开发语言。
我的数据库集合包含 260.640 个文档,这里的格式已简化:
{"_id":1,"time":"2014-01-01 00:00:00","value":"1.37468"}
集合中的所有文档都有一个 id(从 0 到 260640)和一个每次增加一分钟的时间(所以我总共有 6 个月的数据)。
我是 运行 windows 控制台中的 Mongod.exe 服务器和另一个 windows 控制台中的 python Web 服务器,并使用 Google Chrome 查看网页。
我的目标:
我想查询数据库集合,所以我可以得到一个 HTML table 包含两个日期之间的行,例如:2014-01-01 00:00:00 和 2014- 01-10 00:00:00,然后 table 应该可以在 CherryPy 生成的网页上查看。
我的问题:
使用问题中提供的代码,我可以查询数据库并在网页上显示 table,但是,显示大约 7200 行需要大约 30-50 秒,这是只有大约5天的数据,当我需要显示10天的数据甚至一个月的数据时,我们谈论更长的等待时间,问题首先是用户必须等待,而且浏览器可能会超时如果用户 select 更长的时间跨度,这会终止应用程序。
我的慢码:
这是目前有效的代码,但仅作为 "standard car",我需要 "super car"。
def onem(self):
# Get the MongoClient from the PyMongo lib.
client = MongoClient()
# our database name is raw_data
db = client.raw_data
# Get the starting date from the database (returns a valid date string).
date_from = self.getFromDateToDatePickerFromDB();
# Get the end date from the database (returns a valid date string).
date_to = self.getToDateToDatePicker();
# Query the database for the collection of documents.
collection = db.data.find({'time' : {'$gte' : date_from, '$lt' : date_to}})
# Define a variable to hold the temp rows.
html = ""
# for each document in our collection.
for document in collection:
# build the table.
html = html + '''
<tr>
<td>''' + str(int(document['_id'])) + '''</td>
<td>''' + str(document['time']) + '''</td>
<td>''' + str(document['value']) + '''</td>
</tr>
'''
table = '''
<table border="1" celspacing="0" cellpadding="0" width="100%">
<thead>
<tr>
<td>ID</td>
<td>TIME</td>
<td>VALUE</td>
</tr>
</thead>
<tbody>
''' + html + '''
</tbody>
</table>
'''
# return the valid html with the table to a function which
# outputs an html template to the browser.
return self.GetStaticHTML(table)
# Tell CherryPy that we are done working on the webpage and it lets us show it to the browser.
onem.exposed = True
如果你们知道比提供的代码更好的查询 mongodb 数据库的方法:
collection = db.data.find({'time' : {'$gte' : date_from, '$lt' : date_to}})
或者,如果您知道加速数据库、代码或任何东西的方法,那么我真的很想听听。
谢谢,
可能有两个弱点会使您的代码变慢且不可扩展:
- mongo 集合中是否有关于您的时间属性的索引?如果没有,创建该索引,这是一次性操作。
- 您不能 return 所有与搜索匹配的项目,无论您需要 return 的项目数量如何。您必须使用分页,即只有 return 固定数量的项目,例如200 并提供指向前 200 项和后 200 项的链接。
首先,让我在这里解释一下项目问题:
我正在开发 Web 应用程序,使用库 CherryPy、PyMongo,数据库后端是 MongoDB数据库,我使用Python3作为开发语言。
我的数据库集合包含 260.640 个文档,这里的格式已简化:
{"_id":1,"time":"2014-01-01 00:00:00","value":"1.37468"}
集合中的所有文档都有一个 id(从 0 到 260640)和一个每次增加一分钟的时间(所以我总共有 6 个月的数据)。
我是 运行 windows 控制台中的 Mongod.exe 服务器和另一个 windows 控制台中的 python Web 服务器,并使用 Google Chrome 查看网页。
我的目标:
我想查询数据库集合,所以我可以得到一个 HTML table 包含两个日期之间的行,例如:2014-01-01 00:00:00 和 2014- 01-10 00:00:00,然后 table 应该可以在 CherryPy 生成的网页上查看。
我的问题:
使用问题中提供的代码,我可以查询数据库并在网页上显示 table,但是,显示大约 7200 行需要大约 30-50 秒,这是只有大约5天的数据,当我需要显示10天的数据甚至一个月的数据时,我们谈论更长的等待时间,问题首先是用户必须等待,而且浏览器可能会超时如果用户 select 更长的时间跨度,这会终止应用程序。
我的慢码:
这是目前有效的代码,但仅作为 "standard car",我需要 "super car"。
def onem(self):
# Get the MongoClient from the PyMongo lib.
client = MongoClient()
# our database name is raw_data
db = client.raw_data
# Get the starting date from the database (returns a valid date string).
date_from = self.getFromDateToDatePickerFromDB();
# Get the end date from the database (returns a valid date string).
date_to = self.getToDateToDatePicker();
# Query the database for the collection of documents.
collection = db.data.find({'time' : {'$gte' : date_from, '$lt' : date_to}})
# Define a variable to hold the temp rows.
html = ""
# for each document in our collection.
for document in collection:
# build the table.
html = html + '''
<tr>
<td>''' + str(int(document['_id'])) + '''</td>
<td>''' + str(document['time']) + '''</td>
<td>''' + str(document['value']) + '''</td>
</tr>
'''
table = '''
<table border="1" celspacing="0" cellpadding="0" width="100%">
<thead>
<tr>
<td>ID</td>
<td>TIME</td>
<td>VALUE</td>
</tr>
</thead>
<tbody>
''' + html + '''
</tbody>
</table>
'''
# return the valid html with the table to a function which
# outputs an html template to the browser.
return self.GetStaticHTML(table)
# Tell CherryPy that we are done working on the webpage and it lets us show it to the browser.
onem.exposed = True
如果你们知道比提供的代码更好的查询 mongodb 数据库的方法:
collection = db.data.find({'time' : {'$gte' : date_from, '$lt' : date_to}})
或者,如果您知道加速数据库、代码或任何东西的方法,那么我真的很想听听。
谢谢,
可能有两个弱点会使您的代码变慢且不可扩展:
- mongo 集合中是否有关于您的时间属性的索引?如果没有,创建该索引,这是一次性操作。
- 您不能 return 所有与搜索匹配的项目,无论您需要 return 的项目数量如何。您必须使用分页,即只有 return 固定数量的项目,例如200 并提供指向前 200 项和后 200 项的链接。