2013-06-30 134 views
2

,并回答here,我能想出如何动态地蒙戈引擎使用的map/reduce和lambda表达式构建复杂的查询。动态构建和查询Mongoengine

然而,当我试着我的OR查询切换到与查询,我遇到了麻烦(讽刺的是,这个问题的海报上面那样,太,之后他最初的问题得到回答)。

这里是我运行代码:

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__,查询完美。

与往常一样,我不是专家,我盘算的事情了,因为我去,所以我可能失去了一些东西明显。非常感谢这里的任何想法。

回答

0

我这是特殊的行为:https://github.com/MongoEngine/mongoengine/blob/ee725354db066ea11f25dd01387f8d3dcb721c6c/mongoengine/queryset/visitor.py#L58

因为这个查询将始终虚假或只是重复:

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()),所以这个查询没有意义。

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

+0

谢谢 - 真正帮助我理解它。我很感激! – nickgrossman