MongoDB-DBRef到DBObject

MongoDB-DBRef到DBObject,mongodb,mongo-java,dbref,Mongodb,Mongo Java,Dbref,使用Java。。。这并不重要 有问题,可能只是设计问题 我将“_id”字段分配给我的所有文档,甚至是嵌入的文档。 我有一个父文档(以及这些文档的集合),其中包含一个嵌入文档 所以我有点像: { "_id" : "49902cde5162504500b45c2c" , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "_id" : "49902cde5162504500b45c2y",

使用Java。。。这并不重要

有问题,可能只是设计问题

我将“_id”字段分配给我的所有文档,甚至是嵌入的文档。 我有一个父文档(以及这些文档的集合),其中包含一个嵌入文档

所以我有点像:

{ "_id" : "49902cde5162504500b45c2c" , 
  "name" : "MongoDB" , 
  "type" : "database" , 
  "count" : 1 , 
  "info" : { "_id" : "49902cde5162504500b45c2y", 
             "x" : 203 , 
             "y" : 102
           }
}
现在我想要另一个通过
DBRef
引用我的“信息”的文档,不需要副本。因此,我创建了一个
DBRef
,它指向父文档的集合,并将_id指定为xx5c2y。但是,在
DBRef
上调用
fetch()

这是否意味着
DBRef
fetch()
仅适用于顶级集合条目“\u id”字段

我本以为
fetch()
会使用文档大括号内的所有键:值。。但也许这要求太高了。有人知道吗??除了顶层之外,没有办法创建跨文档引用吗


谢谢

是的,您的DBRef\u id引用需要指向集合中的文档,而不是嵌入的文档

如果你想找到嵌入的文档,你需要在
info.\u id
上进行查询,你还需要在上面添加一个索引(为了性能),或者你需要将嵌入的文档存储在一个集合中,并将嵌入的文档视为一个副本。在MongoDB中复制是可以的…'一个事实“一个地方”不适用于这里。。。前提是当主副本发生变化时,您可以通过某种方式更新副本(最终一致性)

顺便说一句,关于DBRef,官方指南说“如果集合可以从一个文档更改到下一个文档,大多数开发人员只会使用DBRef。如果引用的集合总是相同的,则上面概述的手动引用更有效。”


另外,为什么要在文档中引用
info
?如果它是一个数组,我可以理解为什么您可能希望引用单个条目,但由于在您的示例中它似乎不是数组,为什么不直接按其id引用包含文档?

谢谢您的反馈。好的,DBRef。。。仅限顶级文档。我同意你关于“复制”的其他评论,但如果情况确实发生了变化,那么需要制定事件模型来更新许多地点。我的示例(数据模型)并不能真正代表问题模型,在这种情况下,“info”对象实际上是我的问题sapce中的元模型,用于模式分析。因此,对父级(以及父级的子文档)的更改需要更新元模型。我不能完全嵌入这些,因为这意味着改变需要更新数百万个地方。