当前位置:  开发笔记 > 编程语言 > 正文

MongoDB在mongoengine中使用OR子句

如何解决《MongoDB在mongoengine中使用OR子句》经验,为你挑选了1个好方法。

我正在使用python的mongoengine来查询MongoDB,并且大部分都喜欢它,但我遇到了高级查询的问题.

这是我的模特

class ContentItem(Document):
    account = ReferenceField(Account)
    creator = ReferenceField(User)
    public = BooleanField(default=False) 
    last_used = DateTimeField(default=datetime.now)

我想查询ContentItem特定帐户的所有帐户,并由登录用户创建或公开.这是我写的查询

query = ContentItem.objects.filter( (Q(account=account) & Q(public=True)) |  (Q(account=account) & Q(creator=logged_in_user)) ).order_by('-last_used')

要么:

query = ContentItem.objects.filter( Q(account=account) & ( Q(public=True) |  Q(creator=logged_in_user) ) ).order_by('-last_used')

但这些似乎是XOR,无论是否public,或者creator两者都有.这是预期的吗?

我忽略了什么吗?我应该直接用mongodb而不是mongoengine吗?

我目前的解决方法是制作两个不同的查询并合并结果,但随着内容项的数量变大,结果需要很长时间才能回来,因为我需要在订购之前获取所有项目,从而失去所有项目(django)分页结果的好处.



1> apiguy..:

在这种情况下,mongoengine文档显然是不正确的.不应使用按位运算符"&"和"|",而应使用标准运算符"和"和"或".

所以你的第一个查询成为:

query = ContentItem.objects.filter( (Q(account=account) and Q(public=True)) or  (Q(account=account) and Q(creator=logged_in_user)) ).order_by('-last_used')


@apiguy不.你错了第一名.在Python中覆盖`和`/`或`是不可能的,而是可以覆盖`|`/`&`.Q(mongoengine/queryset/visitor.py)的源代码及其历史证实了这一点
您必须使用按位运算符.你不能使用或者组合查询,因为Q(a = a)或Q(b = b)与Q(a = a)不同 Q(B = B).由于Q(a = a)等于真Q(a = a)或Q(b = b)与Q(a = a)相同.文档 - > https://mongoengine-odm.readthedocs.org/guide/querying.html#advanced-queries
@Paul - 也许你没注意到这篇文章已经9个月了,那个bug已经被修复了?
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有