Java запрос mongoTemplate findOne не возвращает результаты, когда id является String - PullRequest
1 голос
/ 10 октября 2019

У меня есть запрос ниже, чтобы найти документ MongoDB, используя mongoTemplate. Это не возвращает никаких результатов, когда я ищу свою цель, используя Id.

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

Но запрос работает, когда я использую любые поля, кроме 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));

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Основываясь на обсуждениях здесь , похоже, что этого достичь невозможно. Вам необходимо изменить тип в базе данных как ObjectId.

Если вы не можете сделать это, вы можете сделать

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

Но это вернет DBObject, вам нужно создать экземпляр Target из этого

0 голосов
/ 11 октября 2019

Мне удалось получить необходимую функциональность с помощью 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);
...