Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Doctrine MongoDB查询按ID区分的集合_Mongodb_Doctrine Odm_Doctrine Mongodb - Fatal编程技术网

使用Doctrine MongoDB查询按ID区分的集合

使用Doctrine MongoDB查询按ID区分的集合,mongodb,doctrine-odm,doctrine-mongodb,Mongodb,Doctrine Odm,Doctrine Mongodb,如何使用Doctrine MongoDB查询只知道其ObjectId的对象?使用$dm->findOneBy(array('id'=>$id))按id进行的查询将只返回一种已识别文档类型的结果,而不会返回其他文档类型的结果。通过命令行进行查询,例如,db.documents.find({“\u id”:ObjectId(…)})返回所需的行 编辑:问题似乎是,如果我不知道要查询的文档类型,并且使用的是自定义存储库,则使用的文档名称仅与两个文档类中的一个类名称绑定(因此,对于其他类型的文档,返回0

如何使用Doctrine MongoDB查询只知道其ObjectId的对象?使用
$dm->findOneBy(array('id'=>$id))
按id进行的查询将只返回一种已识别文档类型的结果,而不会返回其他文档类型的结果。通过命令行进行查询,例如,
db.documents.find({“\u id”:ObjectId(…)})返回所需的行

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

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

谢谢


我有一组存在于同一文档集合中的有区别的文档,根据它们的
类型
字段进行区分,例如

{
  "_id" : ObjectId("510fdb6c91a4cb4c25000000"),
  "name" : "Contract",
  "type" : "document"
}
{
  "_id" : ObjectId("510fdb6c91a4cb4c25000001"),
  "name" : "Tutorial",
  "length_min": "60"
  "type" : "video"
}
...
我对
文档
视频
类的映射如下所示:

<!-- "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>

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

  • 创建不同的存储库,这些存储库仅仅是实际抽象存储库的包装。这会产生依赖注入的开销
  • 获取带有类名限定符的共享存储库,以便查询适当类型的对象

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

    在您的案例中,我只看到一种解决方案,而不需要像上面建议的Sean Quinn那样创建一些额外的包装器存储库

    我会对所有被区分的文档使用一个集合——如果您没有一个用于存储所有类的基类,我会添加一些抽象类。如中所述。长话短说,您只使用一个集合,某个字段通知存储对象的类,查询此存储库后,您将获得一个适当类的对象


    要使用单集合继承映射,需要将
    heritation type=“single_collection”
    属性添加到顶级
    document
    标记中。

    是的,我看了一会儿后得出了几乎相同的结论;最初我考虑使用
    映射超类
    构造,但据我所知,它们不能有与之关联的自定义存储库。感谢您对
    SINGLE_集合
    继承类型的建议。