【问题标题】:Querying discriminated collection by ID using Doctrine MongoDB使用 Doctrine MongoDB 按 ID 查询区分集合
【发布时间】:2013-01-23 20:10:03
【问题描述】:

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

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

请参阅下面的问题抽象。

谢谢!


我在同一个 documents 集合中有一组可区分的文档,由它们的 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>

【问题讨论】:

    标签: mongodb doctrine-odm doctrine-mongodb


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      我会为所有被区分的文档使用一个集合——如果你没有为你存储的所有类提供一个基类,我会添加一些抽象类。它在Doctrine documentation about inheritance mapping 中有描述。长话短说,您只使用一个集合,一些字段告知存储对象的类,在查询此存储库后,您会得到一个适当类的对象。

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

      【讨论】:

      • 是的,我看了一段时间后得出了几乎相同的结论;最初我正在考虑使用 mapped-superclass 构造,但据我所知,它们不能有与之关联的自定义存储库。感谢SINGLE_COLLECTION继承类型的建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 2021-05-19
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多