使用 Python 查询 mongodb 集合的最佳方法是什么 3

What is the best way to query a mongodb collection using Python 3

首先,让我在这里解释一下项目问题:

我正在开发 Web 应用程序,使用库 CherryPyPyMongo,数据库后端是 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}})

或者,如果您知道加速数据库、代码或任何东西的方法,那么我真的很想听听。

谢谢,

可能有两个弱点会使您的代码变慢且不可扩展:

  1. mongo 集合中是否有关于您的时间属性的索引?如果没有,创建该索引,这是一次性操作。
  2. 您不能 return 所有与搜索匹配的项目,无论您需要 return 的项目数量如何。您必须使用分页,即只有 return 固定数量的项目,例如200 并提供指向前 200 项和后 200 项的链接。