2017-03-20 3 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に変換するのが30分以上かかるからです。それとも、私は何かを逃している?どのようにすれば、これらの操作をより迅速に実行できるようにコードを変更できますか?

答えて

0

本当の質問は2番目の段階ですか? mongoコンソールでクエリを実行できます。 30秒ほど実行される場合は、インデックスについて考える必要があります。