2012-12-19 64 views
4

我使用Symfony 2與學說MongoDb捆綁。學說MongoDb嵌入式文檔 - 如何指定字段

有兩類與映射:

/** 
* @MongoDB\Document 
*/ 
class Consultant 
{ 
    /** 
    * @MongoDB\Id(strategy="NONE") 
    */ 
    protected $id; 

    /** 
    * @MongoDB\EmbedMany(targetDocument="Specialization", strategy="set") 
    */ 
    protected $specs; 
} 

/** 
* @MongoDB\Document 
*/ 
class Specialization 
{ 
    /** 
    * @MongoDB\Id 
    */ 
    protected $id; 

    /** 
    * @MongoDB\String 
    */ 
    protected $name; 

    /** 
    * @MongoDB\Boolean 
    */ 
    protected $visible = true; 
} 

節省顧問後,Mongo的記錄是這樣的:

{ 
    "_id": "1", 
    "name": "Manager", 
    "specs": { 
    "0": { 
     "_id": ObjectId("50d071ac6146a1f342000001"), 
     "name": "Support", 
     "visible": false 
    }, 
    "1": { 
     "_id": ObjectId("50d069336146a10244000000"), 
     "name": "Orders", 
     "visible": false 
    } 
    } 
} 

一切除了冗餘字段「可見的」罰款。

有沒有一種方法可以指定使用@EmbedMany批註的Doctrine應嵌入哪些字段?

+0

爲什麼對象有這個字段,如果你不打算嵌入它?你應該在類和它的嵌入類之間建立1:1的關係。 – Sgoettschkes

+0

那麼,我有單獨的集合'專業化'。這是一種與「顧問」分開管理的字典。我決定對該方案進行非規範化並將一個文檔嵌入另一個文檔。 – marden

回答

5

專業化分類使用Document映射,該映射不適用於嵌入。你應該使用EmbeddedDocument

鑑於您希望自己使用同一個類並以嵌入形式使用,最好創建一個用MappedSuperclass註釋的抽象類。在那裏,您可以定義文檔和嵌入式文檔中應該存在的任何字段映射。在你的情況下,你可以在繼承的文檔類上定義visible

另外,請注意,通過使用set策略,您將嵌入式集合存儲爲對象而不是通常的數組。如果您的意思是在非規格化嵌入文檔中對索引字段進行索引,這可能會產生影響,因爲您將無法使用multikey indexing。也可以在數字鍵之間創建空隙。