【问题标题】:Retrieve parent document with a doctrine2 or mongodb query使用学说 2 或 mongodb 查询检索父文档
【发布时间】:2012-08-29 16:06:15
【问题描述】:

我正在使用 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

【问题讨论】:

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


    【解决方案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 指定唯一约束。

    【讨论】:

    • 谢谢!这帮助我理解了可能性。那么在子文档中添加父文档的引用呢?
    • 应该是可以的。
    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多