2011-08-19 88 views
0

使用Java ...並不重要。MongoDB - DBRef到DBObject

有一個問題,也許這只是一個設計問題。

我將「_id」字段分配給我的所有文檔,甚至是嵌入的文檔。 我有有一個嵌入文檔

所以我必須像一個父文檔(和收集那些):

{ "_id" : "49902cde5162504500b45c2c" , 
    "name" : "MongoDB" , 
    "type" : "database" , 
    "count" : 1 , 
    "info" : { "_id" : "49902cde5162504500b45c2y", 
      "x" : 203 , 
      "y" : 102 
      } 
} 

現在我想有另一個文件,該文件通過引用我的「信息」 DBRef,不想要副本。因此,我創建了一個指向父文檔集合的DBRef,並將_id指定爲xxxx5c2y。但是,在DBRef上調用fetch()會給出NULL。

這是否意味着DBReffetch()只適用於頂級收集條目「_id」字段?

我本以爲fetch()會消耗文檔大括號內的所有鍵值:但也許這是要求太高。有人知道嗎??除了頂層之外,沒有辦法創建交叉文檔引用嗎?

感謝

回答

1

是的,你DBREF _id引用需要註冊後才能文檔您的收藏中,不嵌入文檔。

如果你想找到嵌入式文檔,你需要在info._id上做一個查詢,你也需要添加一個索引(對於性能),或者你需要將該嵌入式文檔存儲在收集和處理嵌入的一個作爲副本。在MongoDB中複製是可以的......'一個地方的事實'在這裏不適用......假設你有一些方法來在主變更(最終一致性)時更新副本。

對於DBRef的官方指導,「大多數開發人員只使用DBRefs,如果集合可以從一個文檔更改爲下一個。如果您引用的集合總是相同的,上面列出的手冊參考更有效。 「

另外,您爲什麼要在文檔中參考info?如果它是一個數組,我可以理解爲什麼你可能想引用單個條目,但由於它在你的例子中似乎不是一個數組,所以爲什麼不只是通過它的_id引用包含的文檔呢?

+0

感謝您的反饋意見。好的,只有DBRef ...頂級文檔。我同意你的其他評論:複製,但如果事情確實發生變化並且elaborat事件模型需要更新許多位置。我的例子(數據模型)並不真正代表問題模型,這是一個「信息」對象實際上是我的問題中的元模型的情況,它正在用於模式分析。因此,對父代(和父代的子文檔)的更改需要更新元模型。我不能隨意嵌入這些內容,因爲這意味着需要更新數百萬個地方。 – Robert