0

我正在使用 Symfony 2.1 和 Doctrine - MongoDBBundle。

我有三个文件。第一个是一家公司,我称之为“机构”。第二个是机构内部的联系人,第三个是用户与联系人的谈话。

联系和交流嵌入到机构中,这在现实世界中是真实的。这不是问题。

但是一个联系人被引用到一个 Exchange 文档中。这似乎对教义2更复杂......

首先,我想构建一个表单,它仅建议(在“选项”字段中,即 Symfony 2.1 中的本地选择字段或文档字段)仅嵌入在当前“编辑”的机构中的联系人。

这个怎么做 ?

我尝试使用数据转换器。但这导致了另一个问题:如果我有 Contact 对象,我如何检索父“机构”对象?

这可能与 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 查询机构集合不会产生正确的结果
  • 没有用于查询嵌入式 ObjectId 存储库的通用接口(沿着如何DocumentRepository::find()获取 ObjectId 的行)
  • 没有将 ObjectId 存储在嵌入文档中的约定(与_id文档不同)

为了支持这一点,ODM 需要知道通过 查询机构集合contacts.id,从结果中提取适当的联系人并将其返回。理想情况下,我们希望使用字段选择来仅获取匹配的嵌入文档,如SERVER-828中所述(在今天发布的 MongoDB 2.2 中实现)。ODM 将来是否会获得此功能,它可能会利用该功能。

我的建议是避免在 Exchange 中使用 ODM 引用,而只需将 Contact ObjectId 存储在一个字段中。您仍然可以在机构的存储库上创建一个方法,以返回嵌入式联系人文档中所有 ObjectId 的列表,并将其提供给表单字段。我不确定 DoctrineMongoDBBundle 中的 DocumentType 字段在这里是否合适,但值得一试(我相信存储库方法是可配置的)。

最后,不要忘记在嵌入文档中为 ObjectId 指定唯一约束。

于 2012-08-29T19:20:08.780 回答