2017-03-20 90 views
0

我正在使用Mongoengine對MongoDB數據庫執行查詢,然後將結果保存爲json文件。我的文檔定義是這樣的:在mongoengine中緩慢查詢

class Foo(Document): 
    # fields definitions goes here 

    @queryset_manager 
    def some_fields(self, queryset): 
     return queryset.exclude('field1', 'field2', 'field3') 

正如你所看到的,我已經創建自定義的方法來排除從查詢結果中的一些不必要的字段。但整個過程query->count results->convert to json是非常緩慢。我創建了一些虛擬日誌,以便更好地解釋我的問題

query_start = datetime.datetime.now() 
    foos = Foo.some_fields.filter(**filter_dict) 
    query_end = datetime.datetime.now() 
    logger.debug(
     "%s || Query time: %s" % (str(datetime.datetime.now()), str((query_end - query_start).total_seconds()))) 
    counting_start = datetime.datetime.now() 
    foos_count = foos.count() 
    counting_end = datetime.datetime.now() 
    logger.debug("%s || Foos count: %d in %f" % (
     str(datetime.datetime.now()), foos_count,(counting_end - counting_start).total_seconds(), 
    )) 
    serialization_start = datetime.datetime.now() 
    json_response = foos.to_json() 
    serialization_end = datetime.datetime.now() 
    logger.debug("%s || Serialization time: %s" % (
     str(datetime.datetime.now()), str((serialization_end - serialization_start).total_seconds()))) 

的例子輸出下面

Query time: 0.098477 
Foos count: 0 in 27.771622 
Serialization time: 34.59575 

我猜從以前的步驟,結果沒有被使用的一個部分。我對嗎?因爲我找不到任何其他解釋,將空結果轉換爲json需要半分鐘以上。或者我錯過了什麼?如何更改我的代碼以更快地執行這些操作?

回答

0

也許真正的查詢是在第二階段?您可以在mongo控制檯中運行您的查詢。如果它將運行30秒左右,您應該考慮索引。