【问题标题】:Doctrine MongoDb Embedded Document - How to specify fieldsDoctrine MongoDb Embedded Document - 如何指定字段
【发布时间】:2012-12-19 06:39:28
【问题描述】:

我正在使用带有 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应该嵌入哪些字段?

【问题讨论】:

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

标签: php mongodb symfony doctrine-orm


【解决方案1】:

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

鉴于您想单独使用同一个类并以嵌入形式使用,最好创建一个带有MappedSuperclass 注释的抽象类。在那里,您可以定义文档和嵌入文档中应该存在的任何字段映射。在您的情况下,您可以将 visible 保留在继承文档类上。

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

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多