【问题标题】:Subquerying in MongoEngineMongoEngine 中的子查询
【发布时间】:2011-02-12 01:40:41
【问题描述】:

有示例代码:

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)

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

【问题讨论】:

    标签: python mongodb mongoengine nosql


    【解决方案1】:

    我做错了什么?

    您无法跨参考字段查询 - 请参阅 Embed Vs Reference

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

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

    【讨论】:

    • Ross 这在 MongoEngine 中可用吗?肯定会有用。谢谢。
    • 没有票,我不确定实施它是否明智,因为它涵盖了太多的内部。
    • 好吧,没什么大不了的。这并不是真正的障碍,只是一种便利。谢谢。
    【解决方案2】:

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

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

    因为MongoDB不支持join,你的“加载用户,加载他们的帖子”的方法一般是正确的方法。

    我做错了什么?

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

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 2017-09-11
      • 2013-08-12
      • 2019-04-22
      • 2012-12-09
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多