【问题标题】:Java mongoTemplate findOne query not returning results when id is String当 id 为 String 时,Java mongoTemplate findOne 查询不返回结果
【发布时间】:2019-10-10 09:55:27
【问题描述】:

我有以下查询来使用 mongoTemplate 查找 MongoDB 文档。 当我使用 ID 搜索我的目标时,这不会返回任何结果。

Query query = new Query(Criteria.where("id").is(String.valueOf(targetId)));
mongoTemplate.findOne(query, Target.class));

但是当我使用除 ID 之外的任何字段时,查询有效。有人可以帮助我使用 ID 来解决这个问题。

目标类

@Data
@Document
public class Target {
    @Id
    private String id;
    /**
     * Name of the target
     */
    private String name;
}

数据库文档。

{
    "_id" : "5290d748e4",
    "name" : "Test Target"
}

按名称查询工作正常。

Query query = new Query(Criteria.where("name").is("Test Target"));
mongoTemplate.findOne(query, Target.class));

【问题讨论】:

    标签: java mongodb spring-boot mongo-java mongo-java-driver


    【解决方案1】:

    根据here 的讨论,看来这是不可能实现的。您需要将数据库中的类型更改为ObjectId

    如果你做不到,你可以做到

    mongoTemplate.getCollection("target").findOne(<targetId>) 
    

    但这会返回一个DBObject,你需要从中创建目标实例

    【讨论】:

    • 这也行不通。 mongodb中的id字段是String。 {'_id': "1234"}
    • 你能把你的目标类也放上去吗
    • 但是mongoTemplate.findById(targetId) 工作正常。我需要这个与findOneupdateFirst 一起工作。目前哪些不工作。
    • 将目标类添加到问题中。
    • 你试过这个new Query(Criteria.where("_id").is(new ObjectId(targetId)));
    【解决方案2】:

    我能够通过使用MongoCollection 获得所需的功能。

    MongoDatabase mongoDatabase = mongoTemplate.getDb();
    MongoCollection<Document> targetCollection
                        = mongoDatabase.getCollection(mongoTemplate.getCollectionName(Target.class));
    Document query = new Document();
    query.put("_id", parkTargetId);
    query.put("spots._id", parkingSpotId);
    
    targetCollection.find(query);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-03
      • 2020-09-09
      • 1970-01-01
      • 2019-10-04
      • 2019-10-09
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多