5

Doctrine MongoDb バンドルで Symfony 2 を使用しています。

マッピングを持つ 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 
    } 
  } 
}

冗長フィールド「visible」以外はすべて問題ありません。

@EmbedMany注釈を使用して Doctrine によってどのフィールドを埋め込む必要があるかを指定する方法はありますか?

4

1 に答える 1

6

Specialization クラスは、埋め込みでの使用を意図していないDocumentマッピングを使用します。そのためにEmbeddedDocumentを使用する必要があります。

同じクラスを単独で埋め込み形式で使用する場合は、MappedSuperclassで注釈を付けた抽象クラスを作成するのが最善です。そこでは、ドキュメントと埋め込みドキュメントの両方に存在する必要があるフィールド マッピングを定義できます。あなたの場合、visible継承するドキュメントクラスで定義するために残すことができます。

また、set戦略を使用することにより、埋め込みコレクションを通常の配列ではなくオブジェクトとして格納していることに注意してください。マルチキー インデックスを使用できないため、非正規化された埋め込みドキュメント内のフィールドにインデックスを付ける場合、これは影響を与える可能性があります。数字キーの間にギャップを作成することもできます。

于 2012-12-19T21:13:27.250 に答える