使用Doctrine MongoDB查询按ID区分的集合
如何使用Doctrine MongoDB查询只知道其ObjectId的对象?使用使用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
$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_集合
继承类型的建议。