2017-03-20 55 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秒左右,您应该考虑索引。