我有关于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访问?
非常感谢你。
答案 0 :(得分:0)
RequestFactory本身不会访问数据库。它在这里做的是:
getMembers()
,因为客户通过.with("members")
isLive
方法,或者如果没有Locator
,则使用其{调用实体的findXxx
{1}}(并检查是否返回getId()
。)第一步完全取决于Morphia的实施:
null
上设置lazy = true
,否则RequestFactory是否会调用@Reference
无关紧要,将始终加载成员。getMembers()
,另外三个获得成员;我不认为Morphia会尝试优化数量查询只能使1个查询一次获得所有3个成员)然而,第二步完全取决于您的代码。
请记住,RequestFactory希望您为每个HTTP请求提供一个实体的单个实例。根据我的理解,Morphia有一个Group
正在这样做,但我怀疑它可能被某些方法/查询绕过。