我正在使用python的mongoengine来查询MongoDB,我在很大程度上喜欢它,但我对advanced query有一个问题.

这是我的模型

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')

但这些似乎是异或,如果其中一个是public,或者creator,但不是两者都是.这是预期的吗?

我是不是忽略了什么?我应该直接用mongodb而不是mongoengine来做这件事吗?

我目前的解决方法是进行两个不同的查询并合并结果,但随着内容项的#越来越大,结果需要很长时间才能恢复,因为我需要在订购之前获取所有项目,从而失go (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')

Mongodb相关问答推荐

无法从我的NextJS 14应用程序中的Redux工具包2.0中提取数据

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

有没有一种方法可以找到一个文档并通过 Go 更改 mongodb 中的 id/value 来克隆它

MongoDB 聚合使用 $match 和 $expr 和数组

mongo shell 命令不接受使用 db 命令

mongodb:多键索引 struct ?

如何在 mongodb 中设置整数的默认值?

我怎样才能排序空值在 mongodb 中是最后排序的?

如何检索 MongoDb 集合验证器规则?

MongoDB:单个数据库处理程序的 >5 个打开连接

如何使用 mongodb 和 php 正确处理分页查询?

mongodb-nodejs-driver,DeprecationWarning:collection.count 已弃用

MongoDB 3 Java判断集合是否存在

使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

mongodb启动错误

判断 mongoDB 是否连接

RoboMongo:不显示所有文档

如何通过mongoose更新 mongodb 中的对象?

无法在 mac os 10.9 上安装 mongodb php 驱动程序

是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?