1

如何使用 Doctrine MongoDB 查询只知道其 ObjectId 的对象?通过 id 查询,using$dm->findOneBy(array('id' => $id))将只返回一种已区分文档类型的结果,而不返回其他类型的结果。通过命令行查询,例如db.documents.find({ "_id": ObjectId(...) });返回预期的行。

编辑:问题似乎是,如果我不知道我要查询的文档类型并且我正在使用自定义存储库,则使用的文档名称仅与其中一个的类名称相关联两个文档类(因此对于其他类型的文档返回 0 结果)。这通常是有道理的,因为如果我不知道我正在寻找什么类型的文档,Doctrine 应该如何?给定一个有区别的集合,有没有办法在存储库中自动使用正确的文档名称而无需明确告知教义?

有关问题的抽象,请参见下文。

谢谢!


我有一组受歧视的文档生活在同一个文档集合中,按其type领域进行区分,例如

{
  "_id" : ObjectId("510fdb6c91a4cb4c25000000"),
  "name" : "Contract",
  "type" : "document"
}
{
  "_id" : ObjectId("510fdb6c91a4cb4c25000001"),
  "name" : "Tutorial",
  "length_min": "60"
  "type" : "video"
}
...

我对DocumentVideo类的映射如下所示:

<!-- "Doc" Document mapping -->
<doctrine-mongo-mapping ...>
  <document name="Doc" collection="documents" repository-class="DocRepository">
    <discriminator-field fieldName="type" />
    <discriminator-map>
      <discriminator-mapping value="document" class="Doc" />
      <discriminator-mapping value="video" class="Video" />
    </discriminator-map>

    <field fieldName="id" id="true" />
    <field fieldName="name" field="name" type="string" />
  </document>
</doctrine-mongo-mapping>

<!-- "Video" Document mapping -->
<doctrine-mongo-mapping ...>
  <document name="Video" collection="documents" repository-class="DocRepository">
    <discriminator-field fieldName="type" />
    <discriminator-map>
      <discriminator-mapping value="document" class="Doc" />
      <discriminator-mapping value="video" class="Video" />
    </discriminator-map>

    <field fieldName="id" id="true" />
    <field fieldName="name" field="name" type="string" />
    <field fieldName="length_min" field="length_min" type="int" />
  </document>
</doctrine-mongo-mapping>
4

2 回答 2

1

我为这个问题想出的两个解决方案是:

  1. 创建不同的存储库,这些存储库只是围绕实际抽象存储库进行工作的包装器。这会产生依赖注入的开销。
  2. 使用类名限定符获取共享存储库,以便查询正确类型的对象。

这两种解决方案仍然需要知道类名(或至少知道它的类型,以便可以派生适当的类)。

于 2013-02-14T17:55:30.370 回答
1

在您的情况下,我只看到一个解决方案,而没有像上面建议的 Sean Quinn 那样创建一些额外的包装存储库。

我会为所有被区分的文档使用一个集合——如果你没有你存储的所有类的基类,我会添加一些抽象类。它在有关继承映射的 Doctrine 文档中进行了描述。长话短说,你只使用一个集合,一些字段通知存储对象的类,在查询这个存储库后,你得到一个适当类的对象。

要使用单一集合继承映射,您需要将inheritance-type="SINGLE_COLLECTION"属性添加到顶级document标签。

于 2013-02-25T09:37:46.617 回答