MongoDB DBRef处理GWT的RequestFactory函数调用

时间:2013-08-20 16:48:17

标签: mongodb gwt reference requestfactory dbref

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

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

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

public class Group {

    ...

    @Reference
    List<User> members;

    ...

}

问题:当调用RequestFactory函数getGroup()。with(“members”)时,RequestFactory会获取ONLY 1 DB访问中的所有成员吗?

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

非常感谢你。

1 个答案:

答案 0 :(得分:0)

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

  1. 致电getMembers(),因为客户通过.with("members")
  2. 提出了要求
  3. 对于看到的每个实体代理(在请求或响应中),调用其定位器的isLive方法,或者如果没有Locator,则使用其{调用实体的findXxx {1}}(并检查是否返回getId()。)
  4. 第一步完全取决于Morphia的实施:

    • 因为您未在null上设置lazy = true,否则RequestFactory是否会调用@Reference无关紧要,将始终加载成员。
    • 在任何情况下(无论是渴望还是懒惰),都会导致4个Mongo查询(一个获得getMembers(),另外三个获得成员;我不认为Morphia会尝试优化数量查询只能使1个查询一次获得所有3个成员)

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

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