我正在使用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
答案 0 :(得分:1)
ODM希望引用关系定位文档,而不是嵌入文档。虽然您当然可以将ObjectId存储在嵌入式文档中,但ODM不知道如何解析引用,主要是因为:
DocumentRepository::find()
可以采用ObjectId的方式)_id
不同)为了支持这一点,ODM需要知道通过contacts.id
查询Institution集合,从结果中提取相应的Contact,然后返回。理想情况下,我们希望使用字段选择来仅获取匹配的嵌入式文档,如SERVER-828中所述(在今天发布的MongoDB 2.2中实现)。 ODM是否会在未来获得此功能,它可能会利用该功能。
我的建议是避免在Exchange中使用ODM引用,只需将Contact ObjectId存储在字段中即可。您仍然可以在Institution的存储库上创建一个方法,以返回嵌入的Contact文档中所有ObjectId的列表,并将其提供给表单字段。我不确定DoctrineMongoDBBundle中的DocumentType字段是否适用于此,但它值得一试(我相信存储库方法是可配置的)。
最后,不要忘记在嵌入式文档中为ObjectId指定唯一约束。