我有一个包含以下结构的多个文档的mongodb集合
{
"_id" : "...",
"_class" : "...",
...
"travelers" : [
{
"id": "12345",
"type": "XYZ"
},
{
"id": "67890",
"type": "ABC"
}],
...
}
使用spring数据,我可以获取具有旅行者类型XYZ的文档:
Query query = new Query(Criteria.where("travelers.type").is("XYZ");
List<Something> something = mongoTemplate.find(query, Something.class, COLLECTION_NAME);
但是如果我将查询切换为按旅行者ID提取,我就没有结果:
Query query = new Query(Criteria.where("travelers.id").is("12345");
List<Something> something = mongoTemplate.find(query, Something.class, COLLECTION_NAME);
我启用了所有日志,传出的查询为{"travelers.id" : "12345"}
,看起来正确。直接在db上运行查询{"travelers.id" : "12345"}
会返回正确的结果。
我在集合上尝试的其他查询似乎工作正常。我和&amp;没有旅行者的索引。在这两种情况下都没有结果。我做错了什么?
答案 0 :(得分:4)
带有“id”名称的字段在映射中得到特殊处理 - 请参阅http://docs.spring.io/spring-data/data-mongodb/docs/current/reference/html/#mongo-template.id-handling
当您执行以下操作时,弹出数据映射会将id转换为“_id”:
Query query = new Query(Criteria.where("travelers.id").is("12345");
所以进入mongo的查询不是
{"travelers.id" : "12345"}
但是
{"travelers._id" : "12345"}
spring data mongo记录的查询与mongo的实际内容略有不同。
奇怪的是,在保存数据时,spring数据不会执行此映射。
将id字段重命名为travelerId将解决问题。