2014-11-04 44 views
3

我在此之後文檔非規範化的數據在MongoDB中學說的Symfony 2

http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/tutorials/getting-started.html

而且

http://symfony.com/doc/current/bundles/DoctrineMongoDBBundle/index.html

當我保存我的文檔,我有兩個Collection

這樣的:

{ 
    "_id" : ObjectId("5458e370d16fb63f250041a7"), 
    "name" : "A Foo Bar", 
    "price" : 19.99, 
    "posts" : [ 
     { 
      "$ref" : "Embedd", 
      "$id" : ObjectId("5458e370d16fb63f250041a8"), 
      "$db" : "test_database" 
     } 
    ] 
} 

我想有

{ 
    "_id" : ObjectId("5458e370d16fb63f250041a7"), 
    "name" : "A Foo Bar", 
    "price" : 19.99, 
    "posts" : [ 
     { 
      "mycomment" :"dsdsds" 
      " date" : date 
     } 
    ] 
} 

我想我的非規範化的數據。我該怎麼做?

我可以像使用$推的方法,$ addToSet的MongoDB等?

感謝

回答

6

主義ODM支持referencesembedded documents

在你的第一個例子中,你使用的引用。主文檔(讓我們假設它被稱爲產品)引用許多Post文檔。那些Post文件存在於他們自己的集合中(出於某種原因,這個文件名爲Embedd - 如果你保留這個模式,我會建議重命名)。默認情況下,ODM使用DBRef約定的引用,因此每個引用是本身$ref$id,並且$db領域一個小型的嵌入式文件。

非規範化可以通過使用嵌入的文檔(在你的情況下的@EmbedMany映射)來實現。如果您正在嵌入Post文檔,則應將Post類映射爲@EmbeddedDocument。這告訴ODM,它不是(屬於其自己的集合)一流的文件,所以不會擔心被_id等的跟蹤它(事實上,嵌入式文件甚至不需要標識,除非你想來映射一個)。

我來決定嵌入或引用的經驗法則通常被問自己,「我需要的父文檔的上下文之外這個文件?」如果某個帖子沒有產品記錄之外的身份,我很樂意將其嵌入;然而,如果我後來發現我的應用程序還想向用戶顯示其所有帖子的列表,或者需要通過帖子查詢(例如,所有最近帖子的提要,而不考慮產品),那麼我可能想參考文章在Posts集合中(或根據需要簡單地複製嵌入式帖子)。

或者,您可以決定帖子應該存在於自己的收藏集中嵌入在產品中。在這種情況下,您可以創建一個AbstractPost類作爲@MappedSuperclass並在其中定義常用字段。然後,用Post和EmbeddedPost子類擴展它(相應地映射)。您將負責創建一些代碼以從Post文檔生成EmbeddedPost,該代碼適用於嵌入Product.posts陣列。此外,您需要處理頂級帖子和嵌入帖子之間的數據同步(例如,如果有人編輯帖子評論,您可能還希望更新所有相應的嵌入版本)。


在引用的主題:ODM還支持simple選項參考映射,在這種情況下,將只存儲引用文檔的_id,而不是更大的DBREF對象。在大多數情況下,對於每個引用的文檔,使DBRef存儲集合和數據庫名稱是相當多餘的;但是,如果您使用的是single-collection inheritance,DBRef實際上很有用,因爲ODM使用該對象來存儲額外的鑑別器信息(即被引用對象的類)。

+0

好評!我可以在同一個項目中使用MySQL和mongodb嗎? – Barno 2014-11-13 08:07:50

+1

絕對。 Steve Francia關於[將MongoDB與RDBMS融合用於電子商務]的演講(http://www.mongodb.com/presentations/blending-mongodb-rdbms-e-commerce)描述了我們如何在OpenSky中做到這一點。具體到Doctrine ODM,有兩篇關於[映射到ODM和ORM]的文檔文章(http://doctrine-mongodb-odm.readthedocs.org/en/latest/cookbook/blending-orm-and-mongodb-odm。 html)和[混合ODM和ORM](http://doctrine-mongodb-odm.readthedocs.org/en/latest/cookbook/blending-orm-and-mongodb-odm.html),這可能有助於進一步閱讀。 – jmikola 2014-11-13 17:11:34