0

私はMongoDBに「meta_info」という名前のタイプハッシュとしてマッピングを持っています。これは単に何かのキー/値リストを保持します。動的に(jsを使用して)拡張できるSymfony2のフォームに作成したいと思います。 (基本的に)次のようになります:

<input type="text" name="meta_info[key][]" /><input type="text" name="meta_info[field][]">   [- remove row]
<input type="text" name="meta_info[key][]" /><input type="text" name="meta_info[field][]">   [+ add row]

私の最初のアイデアは、jsを使用して複製できる2つのテキストフィールド(キー/値)を作成することでした(これは問題ではありません)。これは、json文字列onSubmitに変換され、Documentクラスのsetterメソッド内の配列に変換されます。しかし、これはちょっと汚いようです。

フォームの埋め込みについても考えていました(これはsf2.1の埋め込みドキュメントで非常にうまく機能します!)-しかし、単純なキー/値ハッシュ(mongodbにもそのように格納する必要があります)でこれを実現する方法がわかりません)。

アイデアやアプローチをありがとう!

4

1 に答える 1

1

これをSymfonyフォームの観点から考えると、内部フォームの動的なコレクションが必要になる可能性があります。各内部フォームには、キーと値の入力フィールドがあります。ハッシュフィールドを使用してスキーマの概念を本質的に先取りしているため、このケースを処理するための別の実装を考えることはできません。これが主に、MongoDBが同じ方法(ネストされたオブジェクト)で格納される場合でも、このケースをODMに埋め込まれたドキュメント(マッピングがある)と区別するものです。

別の実装の1つは、キーと値のプロパティを含むドキュメントのEmbedMany関係を設定することです。OpenSkyはこれを内部的に使用して、製品の属性を表します。キーと値のペアの単一のオブジェクトではなく、フィールドをkey持つオブジェクトの配列があるため、MongoDBドキュメントで少し多くのストレージを消費しますが、いくつかの明らかな利点があります。value

  • 構造をマッピングできます。これは、既存のODMスキーマとうまく連携します。
  • キーと値のペアごとにモデルがあるので、これをSymfonyフォームで表す方が自然です。
  • おそらく最も重要なのは、このデータでクエリを実行する場合、マルチキーインデックスを利用して動的なキーと値にインデックスを付け、$elemMatchクエリを使用してキー/値を検索できることです。動的キーでハッシュフィールドを使用しているだけの場合、複数のキーにインデックスを付ける簡単な方法はありません(それぞれの個別のフィールドパスには、明示的なインデックス、または複合インデックスでの明示的な言及が必要です)。
于 2012-09-21T18:31:27.867 に答える