MongoEngine中的子查询

2 投票
2 回答
2234 浏览
提问于 2025-04-16 11:40

这里有一段示例代码:

import mongoengine as mongo

class User(mongo.Document):
    name = mongo.StringField()
    age = mongo.IntField()    

class Post(mongo.Document):
    title = mongo.StringField()
    author = mongo.ReferenceField(User)

我想获取所有年龄在30岁以下的用户创建的帖子,一种方法是分两步来请求:

users = User.objects(age__lt=30)
posts = Post.objects(author__in=users)

不过这样做也不是很好,因为它会不必要地多次连接数据库。所以我想一次性完成这个查询,我试过:

posts = Post.objects(author__age__lt=30)

但是这样不行,它只是给我返回了一个空列表,没有错误提示。我哪里做错了呢?

2 个回答

1

... 它不必要地调用并连接数据库多次

MongoDB支持一个叫做$in的功能,这个功能可以让你一次查询多个对象,只需要一次连接。如果你发现有多个连接,可能需要把这个问题反馈给mongoengine的作者。

因为MongoDB不支持连接查询,所以你用的“加载用户,加载他们的帖子”的方法通常是正确的。

我哪里做错了?

要想了解这么详细的问题,最好的办法是直接联系作者。这个github页面上有他的邮箱和博客。查看一下他的代码库,最后一次更新是在2010年10月,版本号是0.4。三个月没有更新在这个领域算是很久了,而且他甚至还没有1.0版本,所以很可能你需要直接和作者沟通。

3

我哪里做错了?

你没有做错什么,只是不能通过引用字段进行查询。你可以查看这个链接了解更多:嵌入与引用

即使语法被支持,背后也需要进行两次查询。如果你觉得这个功能很重要,可以在GitHub上提个建议,我会考虑添加这个功能的 :)

目前,MongoEngine正在快速更新,很快就会有新版本发布!在开发分支上,有一些令人兴奋的改进,包括高效的懒加载和原子保存的更新增量!

撰写回答