Spring Data MongoDB - 嵌入式文档作为其他文档的参考

And*_*lva 7 spring mongodb spring-data spring-data-mongodb

我想知道在其他文档中使用嵌入式文档作为参考是否可能(甚至是正确的).

我知道我可以将嵌入式文档移动到自己的集合中,但主要目标是获得嵌入式文档的性能优势并避免重复.

例如:

用户

{
    _id: ObjectId("4fed0591d17011868cf9c982"),
    _class: "User"
    ...
    addresses: [ {
        _id: ObjectId("87KJbk87gjgjjygREewakj86"),
        _class: "Address",
        ...
    } ]
}
Run Code Online (Sandbox Code Playgroud)

订购

{
    _id: ObjectId("gdh60591d123487658cf9c982"),
    _class: "Order",
    ...
    address: ObjectId("87KJbk87gjgjjygREewakj86")
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 7

你的案例让我想起了典型的关系方法,当我开始使用面向文档的数据库时,我也是它的受害者.引用示例中的所有实体,不再有冗余.

你应该开始习惯于放开规范化并开始复制数据的想法.在许多情况下,很难确定应该引用哪些数据以及应该嵌入哪些数据.不过,你的情况往往很清楚.

在不知道整个域模型的情况下,地址似乎是值对象的完美候选者.不要维护Address集合,将其嵌入用户对象中.在Order,您可以引用用户,这可以隐式地为您提供地址对象,并且可能有意义,因为订单是由用户做出的.

但是......我建议您将地址完全嵌入订单中.首先,它更快,因为您不需要解析引用.其次,发货订单中的地址永远不会改变!考虑去年的订单.如果您持有对该地址的引用,则一旦用户更改其地址,您将丢失它们发送到哪个地址的信息.

建议:始终拍摄地址的快照并将其嵌入到地址中Order.将用户的MongoDB ID保存为@DBRef`Order中的常规字符串(no ).如果用户应更改其地址,您可以查询该用户的所有未发货订单并修改该地址.