У меня есть коллекция MongoDB с документами со следующими полями:
Я хочу написать метод с MongoRepository чтобы найти все документы, которые имеют дату в диапазоне дат, а offerType содержит одну из строк, представленных в списке.
Документы:
Я хочу:
В предыдущем примере я бы получил документы 1 и 2.
Я использую MongoRepository и пользовательский объект, который содержит нужные мне поля:
import java.util.Date;
import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface ReportVocalOrderRepository extends MongoRepository<ReportVocalOrder, String> {
List<ReportVocalOrder> findByDateBetween(Date startDate, Date endDate, Pageable pageable);
List<ReportVocalOrder> findByDateBetweenAndOfferTypeContaining(Date startDate, Date endDate, List<String> offers, Pageable pageable);
}
Вот класс документа:
@JsonInclude(Include.NON_NULL)
@Document(collection = Constants.Mongo.Collections.VOCAL_ORDER_REPORT)
@ApiModel
public class ReportVocalOrder {
@Id
private String id;
private Date date;
private String offerType;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getOfferType() {
return offerType;
}
public void setOfferType(String offerType) {
this.offerType = offerType;
}
}
Первый метод MongoRepository работает нормально; второй вместо этого возвращает пустой список.
Проблема в запросить mongoRepository для поиска поля, которое может содержать одно из значений списка, переданного в качестве аргумента.
Что не так с этой реализацией? Есть ли лучший способ реализовать этот запрос?




Это было проще, чем я думал. Выкладываю ответ, кому интересно:
import java.util.Date;
import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface ReportVocalOrderRepository extends MongoRepository<ReportVocalOrder, String> {
List<ReportVocalOrder> findByDateBetweenAndOfferTypeIn(Date startDate, Date endDate, List<String> offers, Pageable pageable);
}
Итак, смысл в том, чтобы использовать ключевое слово In.
У нас есть еще один вариант использования Query
@Query(value = "{ 'groupId' : ?0 , 'user.$id' : {$in: ?1} }", delete = true)
List<GroupUser> deleteUserInGroup(String groupId, List<ObjectId> userId);
Можешь попробовать.