2

根据这里的问题和答案,我能够弄清楚如何使用 map/reduce 和 lambda 表达式在 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 回答