Doctrine MongoDb嵌入式文档 - 如何指定字段

mar*_*den 5 php mongodb symfony doctrine-orm

我正在使用带有Doctrine MongoDb包的Symfony 2.

有两个带映射的类:

/**
 * @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;
}
Run Code Online (Sandbox Code Playgroud)

保存顾问后,Mongo记录如下所示:

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

一切都很好,除了冗余字段'可见'.

有没有办法指定Doctrine应该使用@EmbedMany注释嵌入哪些字段?

jmi*_*ola 6

Specialization类使用Document映射,该映射不适用于嵌入.您应该使用EmbeddedDocument.

鉴于您希望以自己和嵌入的形式使用相同的类,最好创建一个使用MappedSuperclass注释的抽象类.在那里,您可以定义文档和嵌入文档中应存在的任何字段映射.在您的情况下,您可以visible在继承文档类上定义.

另外,请注意,通过使用set策略,您将嵌入式集合存储为对象而不是通常的数组.如果您的意思是在非规范化的嵌入式文档中索引字段,这可能会产生影响,因为您将无法使用多键索引.也可以在数字键之间创建间隙.