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

时间:2015-07-20 13:03:45

标签: python mongodb indexing pymongo cherrypy

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

我正在开发一个Web应用程序,使用库 CherryPy PyMongo ,数据库后端是一个 MongoDB数据库,我我正在使用 Python 3 作为开发语言。

我的数据库集合包含260.640个文档,这些文档的格式简化为:

{"_id":1,"time":"2014-01-01 00:00:00","value":"1.37468"}

集合中的所有文档都有一个id(从0到260640),每个时间增加一分钟(所以我总共有6个月的数据)。

我在Windows控制台中运行Mongod.exe服务器,在另一个Windows控制台中运行我的python Web服务器,并使用谷歌浏览器查看网页。

我的目标:

我想查询数据库集合,因此我可以获得一个包含两个日期之间行的HTML表格,例如:2014-01-01 00:00:00和2014-01-10 00:00:00,以及然后应该在CherryPy正在制作的网页上查看该表。

我的问题:

使用问题中提供的代码,我可以查询数据库并在网页上显示表格,但是,显示大约7200行大约需要30-50秒,这只是大约5天的数据当我需要显示10天的数据甚至一个月的数据时,我们会谈论更长的等待时间,问题首先是用户必须等待,而且如果用户选择更长的时间跨度,浏览器可能会超时,这会杀死申请。

我的慢代码:

以下是目前有效的代码,但仅作为"标准车",我需要一辆超级跑车"。

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 个答案:

答案 0 :(得分:0)

可能存在两个弱点,使您的代码变慢且无法扩展:

  1. mongo集合中的时间属性是否有索引?如果没有,请创建该索引,这是一次性操作。
  2. 无论您需要返回多少项,都无法返回与搜索匹配的所有项目。你必须使用分页,即只返回固定数量的项目,例如200,并提供前一个和下一个200项的链接。