2012-12-19 36 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。也可以在数字键之间创建空隙。