Spring Data MongoDB查找返回没有结果的查询

时间:2014-02-11 09:30:48

标签: mongodb spring-data spring-data-mongodb

我有一个包含以下结构的多个文档的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;没有旅行者的索引。在这两种情况下都没有结果。我做错了什么?

1 个答案:

答案 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将解决问题。