findAll() — есть ограничение на объем данных, извлекаемых из mongo?

#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() для перечисления всех ваших документов.