使用doctrine2或mongodb查询检索父文档

时间:2012-08-29 16:06:15

标签: mongodb symfony doctrine-orm symfony-2.1 doctrine-odm

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

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

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

但是联系人被引用到Exchange文档中。对于教条2来说,这似乎更复杂......

首先,我想构建一个表单(在#34;选项"字段中,它是Native Choices字段或Symfony 2.1中的Document字段)只显示当前机构中嵌入的联系人"编辑"

怎么做?

我尝试使用数据转换器。但这会导致另一个问题:如果我有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
#...

for Exchange:

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

1 个答案:

答案 0 :(得分:1)

ODM希望引用关系定位文档,而不是嵌入文档。虽然您当然可以将ObjectId存储在嵌入式文档中,但ODM不知道如何解析引用,主要是因为:

  • 联系人没有自己的存储库类
  • 使用Contact ObjectId查询Institution集合不会产生正确的结果
  • 没有用于查询嵌入式ObjectId的存储库的通用接口(沿着DocumentRepository::find()可以采用ObjectId的方式)
  • 在嵌入式文档中存储ObjectId没有约定(与文档_id不同)

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

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

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