0

我有与 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 是否会在只有 1 个 DB 访问中获得所有成员?

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

非常感谢您提前。

4

1 回答 1

0

RequestFactory 本身不访问 DB。它将在这里做的是:

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

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

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

但是,第二步完全取决于您的代码。

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

于 2013-08-21T12:49:48.283 回答