在Mongoengine中动态构建AND查询

时间:2013-06-30 02:07:53

标签: python mongodb mongoengine

基于问题和答案here,我能够弄清楚如何使用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__时,查询效果非常好。

一如既往,我不是专家,而且在我走的时候正在搞清楚事情,所以我可能会遗漏一些明显的东西。非常感谢此处的任何想法。

1 个答案:

答案 0 :(得分: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()),所以这个查询没有意义。

您必须捕获此异常并从过滤器中删除此查询,因为它没有意义。