拥有示例代码:
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)
但即使这并非完全不好,它正在不必要地调用和连接数据库N次。所以我想在一步中完成查询,我试过了:
posts = Post.objects(author__age__lt=30)
但是不起作用,它只返回一个空列表,而不是错误。我做错了什么?
答案 0 :(得分:3)
我做错了什么?
您无法跨参考字段查询 - 请参阅Embed Vs Reference
因此,即使支持语法,它也会在幕后进行两次查询。如果它想要的东西 - 给github添加一张票,我会考虑添加它:)
MongoEngine的更新目前正在迅速发布 - 所以即将推出新版本! dev分支上有一些令人兴奋的改进,包括有效的懒惰解除引用和更新原子节省的增量!
答案 1 :(得分:1)
......它不必要地调用并连接数据库N次
MongoDB支持$in
子句,允许选择只有一个查询,一个连接的多个对象。如果您看到多个连接,您应该向mongoengine的作者报告。
由于MongoDB不支持联接,“加载用户,加载帖子”的方法通常是正确的方法。
我做错了什么?
对于这种详细程度,最好的选择是contact the author directly。 github页面包含他的电子邮件和他的博客。看看回购,他的最后一次更新是2010年10月,最后一个版本号是0.4。没有更新的三个月在这个领域很长一段时间,他甚至没有1.0版本,所以你很可能需要直接与作者交谈。