我正在使用带有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;
}
保存顾问后,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 :(得分:6)
Specialization类使用Document映射,该映射不适用于嵌入。您应该使用EmbeddedDocument。
鉴于您希望以自己和嵌入的形式使用相同的类,最好创建一个使用MappedSuperclass注释的抽象类。在那里,您可以定义文档和嵌入文档中应存在的任何字段映射。在您的情况下,您可以在继承文档类上定义visible
。
另外,请注意,通过使用set
策略,您将嵌入式集合存储为对象而不是通常的数组。如果您要在非规范化的嵌入式文档中索引字段,则可能会产生影响,因为您将无法使用multikey indexing。也可以在数字键之间创建间隙。