2

ここでの質問と回答に基づいて、マップ/リデュースとラムダ式を使用して、mongo エンジンで複雑なクエリを動的に構築する方法を理解することができました。

ただし、OR クエリを AND クエリに切り替えようとしたときに、問題が発生しました (皮肉なことに、上記の質問の投稿者も、最初の質問に回答した後にそうしました)。

私が実行しているコードは次のとおりです。

titles = ['topic1', 'topic2', 'topic3']
query = reduce(lambda q1, q2: q1.__and__(q2), 
               map(lambda the_title: Q(slug__iexact=the_title), titles))
threats = Threat.objects.filter(query)

これを行うと、次のエラーが表示されます。

InvalidQueryError: Duplicate query conditions: slug__iexact

ただし、同じコードを実行すると、代わり__and____or__、クエリは完全に機能します。

いつものように、私は専門家ではなく、行っていくうちに物事を把握しているので、明らかな何かが欠けている可能性があります。ここでアイデアをお寄せいただきありがとうございます。

4

1 に答える 1

0

これは特別な動作です: https://github.com/MongoEngine/mongoengine/blob/ee725354db066ea11f25dd01387f8d3dcb721c6c/mongoengine/queryset/visitor.py#L58 .

このクエリは常に False になるか、単に複製されるためです。

Q(slug__iexact='topic1') and Q(slug__iexact='topic2') <==> False
Q(slug__iexact='topic1') and Q(slug__iexact='topic1') <==> Q(slug__iexact='topic1')

しかし、重複が無視されたように見えるops = set(query.keys())ので、このクエリには意味がありません。

意味がないため、この例外をキャッチしてフィルターからこのクエリを削除する必要があります。

于 2013-06-30T05:38:06.647 に答える