#java #spring #mongodb
#java #весна #mongodb
Вопрос:
У меня есть документы по типу:
{
"_id":{"$oid":"5fa6cdf065249ffc1282e880"},
"ask":["java",
"what is java",
"java is"],
"answer":"Java is a class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible"
}
Как мне получить документ по значению в массиве?
Например, я пишу «java is» и хочу получить этот документ, но «java is» находится в массиве.
Я легко получал документы, когда поле «спросить» было строкой:
@Repository
public interface PostRepository extends MongoRepository<Answer, String> {
public Answer findAnswerByAsk(String ask);
}
Ответ №1:
Используя репозиторий Spring data mongodb, вы можете искать элемент в коллекции по Containing
ключевому слову. Справочная документация.
@Repository
public interface PostRepository extends MongoRepository<Answer, String> {
public Answer findAnswerByAskContaining(String ask);
}
Используя mongoTemplate
помощник, вы можете использовать $elemMatch
Query query = new Query();
query.addCriteria(Criteria.where("ask").elemMatch(Criteria.is("java is"));
mongoTemplate.find(query, Document.class);
Ответ №2:
Вам нужен только этот запрос
db.collection.find({
"ask": "java is"
})
Он получит документ, содержащий ‘java is’ в ask
поле.
Пример здесь
Использование Spring Boot
я не могу протестировать, но использование @Query
должно работать.
Что-то вроде этого (повторяю, не проверял):
@Query("{ 'ask': ?0}")
public Answer findAnswerByAsk(String ask);
Комментарии:
1. Хороший брат! Это именно то, что я хотел решить. И это неплохой ресурс, который вы мне дали. Скажите, есть ли какие-нибудь хорошие руководства о том, что указывать в скобках @Query?
2. Baeldung имеет несколько руководств. Здесь объясняется
@Query
аннотация.