2

有示例代码:

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)

但不起作用,它只是返回一个空列表,而不是错误。我究竟做错了什么?

4

2 回答 2

3

我究竟做错了什么?

没有什么是您无法跨参考字段查询的 - 请参阅嵌入与参考

因此,即使支持语法,也需要在幕后进行两次查询。如果它是想要的东西 - 向 github 添加一张票,我会考虑添加它:)

目前,MongoEngine 的更新速度很快 - 所以很快就会有一个新版本!dev分支上有一些令人兴奋的改进,包括高效的惰性解除引用和更新增量以进行原子保存!

于 2011-06-17T07:17:17.387 回答
1

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

MongoDB 支持一个$in子句,该子句允许通过一个查询、一个连接来选择多个对象。如果您看到多个连接,您可能应该将此报告给 mongoengine 的作者。

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

我究竟做错了什么?

对于这种详细程度,您最好直接联系作者。github 页面有他的电子邮件和他的博客。查看 repo,他的最后一次更新是 2010 年 10 月,最后一个版本号是 0.4。三个月没有更新在这个领域是很长的时间,他甚至没有 1.0 版本,所以你很可能需要直接与作者交谈。

于 2011-02-13T21:24:55.690 回答