【问题标题】:MongoDB DBRef handling inside GWT's RequestFactory function callGWT 的 RequestFactory 函数调用中的 MongoDB DBRef 处理
【发布时间】:2013-08-20 16:48:17
【问题描述】:

我有关于 MongoDB 的 DBRef 的问题。想象一下这种情况:

Group{
...
 "members" : [
            {
                    "$ref" : "User",
                    "$id" : ObjectId("505857a4e4b5541060863061")
            },
            {
                    "$ref" : "User",
                    "$id" : ObjectId("50586411e4b0b31012363208")
            },
            {
                    "$ref" : "User",
                    "$id" : ObjectId("50574b9ce4b0b3106023305c")
            },
]
...
}

所以给定的组文档有 3 个用户 DBRef。在 Group 的 java 类中,成员用 morphia 标记为@Reference:

public class Group {

    ...

    @Reference
    List<User> members;

    ...

}

问题:当调用 RequestFactory 函数 getGroup().with("members") 时,RequestFactory 会获得所有成员的唯一数据库访问权限吗?

或者在上面给出的场景中,请求工厂会为 Group 文档中的每个 DBRef 进行 3 个 DB 访问?

非常感谢您。

【问题讨论】:

    标签: mongodb gwt reference requestfactory dbref


    【解决方案1】:

    RequestFactory 本身不访问数据库。它会在这里做的是:

    1. 调用getMembers(),因为它是客户端通过.with("members")请求的
    2. 对于每个看到的实体代理(在请求中或响应中),调用其定位器的isLive 方法,或者如果没有Locator,则使用其getId() 调用实体的findXxx(并检查是否null 被返回)。

    第一步完全取决于 Morphia 的实现:

    • 因为你没有在你的@Reference上设置lazy = true,所以无论RequestFactory是否调用getMembers(),成员都会被加载。
    • 在任何情况下(无论是渴望获取还是延迟获取),都会导致 4 个 Mongo 查询(一个获取 Group,另一个获取成员 3 个;我认为 Morphia 不会尝试优化查询数量以一次只进行 1 次查询以获取所有 3 名成员)

    然而,第二步完全取决于您的代码。

    请记住,RequestFactory 希望您为每个 HTTP 请求提供一个实体的单个实例。据我了解,Morphia 有一个 EntityCache 这样做,但我怀疑它可能会被某些方法/查询绕过。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2011-07-13
      • 2015-10-21
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      相关资源
      最近更新 更多