我使用Mongoengine对MongoDB数据库执行查询,然后将结果保存为json文件。我的文档定义如下:
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 :(得分:0)
也许真正的查询是在第二阶段?您可以在mongo控制台中运行查询。如果它将运行大约30秒,你应该考虑索引。