2011-11-08 30 views
2

如果有人能回答我的新手MongoDB問題,我將不勝感激。關於_id和嵌套對象

  1. 會有什麼後果,如果在數據庫或收集用戶指定_id字段將不會是唯一的 ?在什麼範圍內真正需要唯一性 (嵌套對象的範圍是什麼)?

  2. 是否可以更改(替換)集合中整個文檔的_id(及其類型)?

  3. 當我以json對象的形式存儲(參見下面的-A)或嵌入的具有_id(B)的文檔時,嵌套對象之間有什麼區別(由DB引擎處理)?

    A){book: _id:.. chapters[{json object has not _id},{}]}

    B){book: _id:.. chapters[{_id:... },{}]}

    只是在_id和索引或更深層次的東西的存在有什麼區別?

  4. 如何將「只是json對象」(不帶_id)轉換爲帶_id的嵌入文檔?

回答

2

會有什麼後果,如果在數據庫或收集用戶指定_id字段將不會是唯一的 ?在什麼範圍內唯一性是非常必要的( 嵌套對象的範圍是什麼)?

唯一性在任何數據集中都非常重要,因爲您需要一種方法來通過某種身份識別您的數據。唯一ID是這個關鍵。

當你定義一個唯一的索引時,它非常重要。當您嘗試在唯一索引中添加重複鍵時,它會被擰緊。

是否有可能改變(替換)_id(及其類型)集合中的整個 文件?

沒有不可能的直接方式,您需要將文檔數據複製到臨時集合中,並將它們重新插入到具有新標識的原始集合中。

是什麼,當我只存儲作爲JSON對象嵌套 對象之間的差異(以處理由DB引擎)(見下文 - A)或 嵌入文檔與_id(B)?

嵌入的對象是由MongoDB中,將參照對象將通過代碼手動處理主要由ODM廠商(如紅寶石Mongoid)

既然你問的差異本身支持的那些,嵌入文檔像對待文檔中的另一個字段,以便您可以查詢它,您可以將其編入索引並作爲文檔的一部分返回。

但引用文檔完全是一個單獨的文檔。你不能直接從父文檔查詢它,所以索引。相反,您必須編寫應用程序邏輯來存儲ID並從應用程序手動查詢它們。

如何將「just json objects」(不帶_id)轉換爲帶有_id的嵌入式 文檔?

你的假設是錯誤的。嵌入式文檔具有ID。它會在您創建一個時自動生成。

編輯:

我的假設是錯誤的這一點。 Mongodb不會自動生成嵌入式文檔的ID。但是像Mongoid這樣的一些ODM也會爲嵌入式文檔生成ID。

+0

謝謝你的回答,Ramesh。但是我沒有得到關於沒有的東西。你說所有的對象{}都會自動帶有_id? MongoidBook.new({:title =>「NewBook」,:brief => {:history =>「old」},items:[{:name =>「Alex」}]})object brief and item [0] do沒有和_id字段。也許我誤解了一些東西? – WHITECOLOR

+0

@WHITECOLOR,多數民衆贊成在奇怪的,你會更新您的帖子與您的模型定義...以及您使用哪個驅動程序? – RameshVel

+0

好在Rubby我只爲Book集合對象定義了mongoid模型。但是我對標準Mongo控制檯插入有相同的結果:books.insert({title:「SuperBook」,brief:{history:「new」},items:[{name:「Alex」}]} - brief和item is without _id – WHITECOLOR