#java #mongodb #spring-data-mongodb
#java #mongodb #весна-данные-mongodb
Вопрос:
У меня не такая уж большая коллекция, и мы хотим просто получить все документы. Мы используем findAll(), и он работает для сбора с 33,5 тыс. (45 МБ) документов, но мы получаем ошибку при сборе 130 тыс. (50 МБ).
Я знаю, что я могу получить все элементы, например, с помощью chunking (skip / limit), но мне любопытно:
Это ограничение findAll() находится в spring-data или просто в mongo?
Насколько велик этот лимит? Он основан на МБ данных или количестве документов?
Могу ли я как-то изменить этот лимит?
Мы используем spring-data-mongo 2.2.5.RELEASE и mongo 3.6.17
Комментарии:
1. В чем ошибка?
Ответ №1:
Взглянув на документацию MongoDB и мои резюме Университета Монго, ни в mongo shell, ни в mongo compass нет метода findAll, и если вы хотите выполнить итерацию по ним, вы должны использовать оператор «it».
Итак, я предполагаю, что ограничение исходит от вашего соединителя mongo, который отвечает за выборку данных.
Ответ №2:
У меня есть два предложения для вас:
первый: поток
// Repository
@Query(value="{name: ?0}",
fields = "{ _id: 1 }")
Stream<Item> getLatestApprovedIdByName(String name);
// Service
default Item getLatestApprovedIdByName(String name) {
return getLatestApprovedIdByName(name).stream().findFirst().orElse(null);
}
второе: доступно для просмотра
// Repository
@Query(value = "{name: ?0,fields = "{ _id: 1 }")
Page<Item> getLatestApprovedIdByName(String name, Pageable pageable);
// Service
default Item getLatestApprovedIdByName(String name) {
PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "approval.approvedDate"));
return getLatestApprovedIdByName(name, request).getContent().get(0);
}
Комментарии:
1. спасибо, я обнаружил, что Stream — это правильный путь, но мне интересно, где существует это ограничение.
Ответ №3:
Просто используйте toArray()
для перечисления всех ваших документов.