【问题标题】:Spring Data MongoDB find query returning no resultsSpring Data MongoDB查找查询没有返回结果
【发布时间】:2014-02-11 09:30:47
【问题描述】:

我有一个 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"},看起来正确。直接在数据库上运行查询{"travelers.id" : "12345"} 会返回正确的结果。

我在该集合上尝试过的其他查询似乎工作正常。我已经尝试过在 traveller.id 上使用和不使用索引,但在这两种情况下都没有结果。我做错了什么?

【问题讨论】:

  • 您能否仔细检查一下 id 确实是一个字符串(因此需要引号)而不是一个整数?
  • 已经检查过了。 id 是一个字符串。
  • 您确定 COLLECTION_NAME 与 mongo 中的集合匹配吗?
  • @frant.hartm - 是的,集合名称是正确的。正如我所提到的,具有相同集合的其他查询工作正常。
  • 尝试将 id 字段重命名为 travelerId - 名称为“id”的字段在映射中得到特殊处理 - 请参阅 docs.spring.io/spring-data/data-mongodb/docs/current/reference/…

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


【解决方案1】:

名称为“id”的字段在映射中得到特殊处理 - 请参阅 http://docs.spring.io/spring-data/data-mongodb/docs/current/reference/html/#mongo-template.id-handling

当您执行此操作时,spring 数据映射会将您的查询的 id 转换为“_id”:

Query query = new Query(Criteria.where("travelers.id").is("12345");

所以去mongo的查询不是

{"travelers.id" : "12345"}

但是

{"travelers._id" : "12345"}

spring data mongo 记录的查询与实际发送到 mongo 的查询略有不同。

奇怪的是spring data在保存数据的时候并没有做这个映射。

将 id 字段重命名为 travelerId 之类的名称可以解决问题。

【讨论】:

  • 这有点烦人,当它是一个顶级文档时我可以理解,但是当它是文档中的一个对象时,他们不应该自动强制以这种方式映射,他们应该把它当作是。
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
相关资源
最近更新 更多