如何获取Spring数据以从Mongo读取不';没有类属性

如何获取Spring数据以从Mongo读取不';没有类属性,spring,mongodb,spring-data-mongodb,Spring,Mongodb,Spring Data Mongodb,MongoTemplate将一个名为“_class”的属性插入到它放入Mongo的任何内容中,有很多方法可以关闭它 然而,它似乎不愿意读回任何没有_class属性的内容。简单地将其从mongo文档中删除似乎会使其无法访问。因为读取您自己没有编写的数据是一个明显的用例,所以我想我一定遗漏了一些东西 我一直在尝试使用这个: List<SomeClass> list = mongoTemplate.findAll(SomeClass.class, "someCollection"); L

MongoTemplate将一个名为“_class”的属性插入到它放入Mongo的任何内容中,有很多方法可以关闭它

然而,它似乎不愿意读回任何没有_class属性的内容。简单地将其从mongo文档中删除似乎会使其无法访问。因为读取您自己没有编写的数据是一个明显的用例,所以我想我一定遗漏了一些东西

我一直在尝试使用这个:

List<SomeClass> list = mongoTemplate.findAll(SomeClass.class, "someCollection");
List List=mongoTemplate.findAll(SomeClass.class,“someCollection”);
…其中SomeClass用@Id和@Document进行注释,someCollection中的文档以其他方式正确映射到对象。我可以通过在代码中创建其中一个对象来验证这一点,使用insert将其放入Mongo,然后查看是否可以再次读取它


如果_类在那里,那么它就可以正常工作,但如果不在那里,它就会失败。我不关心多态性或任何实际需要这个属性的东西。如何让MongoTemplate读取它自己没有写入的数据?

Spring的
MappingMongoConverter
使用
MongoTypeMapper
来确定从数据库中读取DBObject时使用的类型。
DefaultMongoTypeMapper
使用
“\u class”
属性按照您所描述的方式工作


您应该能够实现自己的
MongoTypeMapper
,并告诉
mappingmongoconcerter
使用它。您的版本可以使用其他指示符而不是
“\u class”
值来确定读取时应创建的类型。

好的,我找到了答案……DavidA的建议是正确的,但缺少关键部分:当您与空类型映射业务建立MappingMongoConverter交易时,它不仅停止编写“\u class”污染,但也停止尝试阅读它。这会导致它退回到您在尝试从Mongo检索文档时提供的类型

我没有看到任何地方有人真正提到这一点。:)

因此,对于遇到此问题的任何其他人,这里是我使用的XML配置(改编自我在StackOverflow上的其他地方找到的内容,但我丢失了链接,很抱歉):


…这就产生了我想要的UnifiedProduct类别,而且没有令人讨厌的“U类”污染。

DavidA:谢谢您的回复。这听起来像是答案是它不能。我对此有点困惑——我明确地告诉它我想要它使用什么类(“上面代码段中的SomeClass.class”),所以我不明白为什么spring data mongo会这样设计,特别是当其他NoSQL和/或JSON映射实现没有这种限制时。我想我会尝试制作一个MongoTypeMapper,它总是使用我所关心的单一类型,看看是否有效。很好。很高兴知道。我正要发表一篇关于尝试显式转换器的评论,但这是一个更通用的解决方案。谢谢你回来发布完整的答案。
<mongo:db-factory id="mongoDbFactory" host="${mongo.host}" port="${mongo.port}" dbname="${mongo.dbname}"/>

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    <constructor-arg name="mongoConverter" ref="mongoConverter" />
    <property name="writeResultChecking" value="EXCEPTION" />
</bean>

<bean id="mongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
    <constructor-arg name="typeKey"><null/></constructor-arg>
</bean>

<bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />

<bean id="mongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    <constructor-arg name="mappingContext" ref="mongoMappingContext" />
    <property name="typeMapper" ref="mongoTypeMapper"></property>
</bean>
//build query object
UnifiedProduct mpp = mongoTemplate.findOne(query, UnifiedProduct.class, "collection-name");