0

私はSymfony2.1とDoctrine-MongoDBBundleを使用しています。

私は3つの文書を持っています。一つ目は、私が「インスティテューション」と呼んでいる会社です。2つ目は施設内の連絡先であり、3つ目はユーザーが連絡先と行った話し合いです。

ContactとExchangeはInstitutionに組み込まれていますが、これは現実の世界でも当てはまります。これは問題ではありません。

ただし、連絡先はExchangeドキュメントで参照されます。これはdoctrine2ではもっと複雑なようです...

最初に、(Symfony2.1のNativeChoicesフィールドまたはDocumentフィールドである「option」フィールドに)現在「編集」されている機関に埋め込まれている連絡先のみを提案するフォームを作成したいと思います。

これを行う方法 ?

データトランスを使ってみました。しかし、これは別の問題につながります。Contactオブジェクトがある場合、親の「Institution」オブジェクトを取得するにはどうすればよいですか?

これはMongoDBネイティブクエリで可能ですか?またはクエリビルダーを使用しますか?

これは私のYAMLマッピングです:

機関の場合:

SOFFT\ContactBundle\Document\Institution:
  type: document
  fields:
    id:
      id: true
      type: id
# ...
  embedMany:
    contacts:
      targetDocument: Contact
    exchange:
      targetDocument: Exchange

連絡先:

SOFFT\ContactBundle\Document\Contact:
  type: embeddedDocument
  fields:
    id:
      id: true
#...

交換用:

SOFFT\ContactBundle\Document\Exchange:
  type: embeddedDocument
  fields:
    id:
      id: true
#...
  referenceOne:
    contact:
      targetDocument: Contact
4

1 に答える 1

1

ODM は、埋め込みドキュメントではなく、参照関係がドキュメントを対象とすることを想定しています。確かに ObjectId を埋め込みドキュメント内に格納できますが、ODM は参照を解決する方法を知りません。主な理由は次のとおりです。

  • 連絡先には独自のリポジトリ クラスがありません
  • Contact ObjectId を使用して Institution コレクションをクエリしても、正しい結果が得られない
  • 埋め込まれた ObjectId のリポジトリをクエリするための共通のインターフェイスはありません (ObjectId を取得する方法に沿ってDocumentRepository::find())
  • ObjectId を埋め込みドキュメントに格納するための規則はありません (ドキュメントとは異なり_idます)。

これをサポートするために、ODM は によって Institution コレクションをクエリしcontacts.id、結果から適切な Contact を抽出し、それを返すことを知る必要があります。理想的には、 SERVER-828 (本日リリースされた MongoDB 2.2 で実装) で説明されているように、フィールド選択を使用して、一致する埋め込みドキュメントのみを取得したいと考えています。ODM が将来この機能を取得する場合、その機能を利用する可能性があります。

私のアドバイスは、Exchange で ODM 参照を使用することを避け、単純に Contact ObjectId をフィールドに格納することです。機関のリポジトリにメソッドを作成して、埋め込まれた連絡先ドキュメントからすべての ObjectIds のリストを返し、それをフォーム フィールドにフィードすることもできます。ここで DoctrineMongoDBBundle の DocumentType フィールドが適切かどうかはわかりませんが、試してみる価値はあります (リポジトリ メソッドは構成可能であると思います)。

最後に、埋め込まれたドキュメントの ObjectId に固有の制約を指定することを忘れないでください。

于 2012-08-29T19:20:08.780 に答える