我正在使用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)分页结果的好处.
在这种情况下,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')