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

Php Doctrine MongoDb嵌入式文档-如何指定字段,php,mongodb,symfony,doctrine-orm,Php,Mongodb,Symfony,Doctrine Orm,我正在使用Symfony 2和Doctrine MongoDb捆绑包 有两个类具有映射: /** * @MongoDB\Document */ class Consultant { /** * @MongoDB\Id(strategy="NONE") */ protected $id; /** * @MongoDB\EmbedMany(targetDocument="Specialization", strategy="set")

我正在使用Symfony 2和Doctrine 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
注释指定原则应该嵌入哪些字段?

专门化类使用一个映射,该映射不用于嵌入。你应该用这个

考虑到您希望以嵌入形式单独使用同一个类,最好创建一个带有注释的抽象类。在这里,您可以定义文档和嵌入文档上应该存在的任何字段映射。在您的情况下,可以让
可见
,以便在继承文档类上定义


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

如果不打算嵌入此字段,为什么对象会有此字段?你应该在类和它的嵌入类之间建立1:1的关系。我有一个单独的集合
专门化
。这是一种与
Consultant
分开管理的词典。我决定对方案进行非规范化,并将一个文档嵌入到另一个文档中。