使用Doctrine MongoDB通过ID查询有区别的集合

时间:2013-02-08 05:16:33

标签: mongodb doctrine-odm doctrine-mongodb

如何使用Doctrine MongoDB查询只知道ObjectId的对象?使用$dm->findOneBy(array('id' => $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>

2 个答案:

答案 0 :(得分:1)

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

  1. 创建不同的存储库,这些存储库只是围绕实际抽象存储库执行工作的包装器。这会产生依赖注入的开销。
  2. 使用类名限定符获取共享存储库,以便查询正确类型的对象。
  3. 两个解决方案仍然需要知道类名(或至少它的类型,以便可以派生适当的类)。

答案 1 :(得分:1)

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

我会对所有被区分的文档使用单个集合 - 如果你没有为你存储的所有类创建基类,我会添加一些抽象类。它在Doctrine documentation about inheritance mapping中描述。简而言之,您只使用一个集合,一些字段通知存储对象的类,并且在查询此存储库后,您将获得一个适当类的对象。

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