Как я могу найти объект в MongoDB по совпадению в массиве этого объекта?

#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 аннотация.