Можно ли запросить MongoDB несколько раз за запрос? - программирование
Подтвердить что ты не робот

Можно ли запросить MongoDB несколько раз за запрос?

Исходя из фона RDBMS, у меня всегда было впечатление "Постарайтесь изо всех сил, чтобы использовать один запрос, считая его эффективным", что означает, что это дорого стоит для каждого запроса, который вы делаете в базе данных. Когда дело доходит до MongoDB, похоже, что это может быть невозможно, потому что вы не можете присоединиться к таблицам.

Я понимаю, что он не должен быть реляционным, но они также подталкивают его к целям, таким как блоги, форумы и все, с чем я сможем найти RDBMS.

Есть некоторые зависания, которые я пытался понять эффективность MongoDB или NoSQL в целом. Если бы я хотел получить все "сообщения", связанные с определенными пользователями (как если бы они были сгруппированы)... используя MySQL, я бы, вероятно, сделал несколько объединений и получал их с этим.

В MongoDB, предполагая, что мне нужны отдельные коллекции, было бы эффективно использовать большие $in: ['user1', 'user2', 'user3', 'user4',...]?

Через какое-то время этот метод замедляется? Если я включу 1000 пользователей? И если мне нужно было получить список сообщений, связанных с пользователями X, Y, Z, было бы эффективно и/или быстро использовать MongoDB:

  • Получить массив пользователей
  • Получить сообщения пользователей в массиве пользователей

2 запроса для одного запроса. Это плохая практика в NoSQL?

4b9b3361

Ответ 1

Чтобы ответить Q на $в....

Я провел несколько тестов производительности со следующим сценарием:

~ 24 миллиона документов в коллекции
Поиск 1 миллиона из этих документов на основе ключа (индексированного)
Использование драйвера CSharp из .NET

Результаты:
Запрос 1 за раз, однопоточная: 109s
Запрос 1 за раз, multi threaded: 48s
Запрос 100K за раз с использованием $in, single threaded = 20s
Запрос 100K за раз с использованием $in, multi threaded = 9s

Значительно лучше производительность с использованием большого $in (ограниченного максимальным размером запроса).

Update: Следуя приведенным ниже комментариям о том, как $in выполняет с различными размерами блоков (запросы многопоточные):

Запрос 10 за раз (100000 партий) = 8.8s
Запрос 100 за раз (10000 партий) = 4.32s
Запрос 1000 за раз (1000 партий) = 4.31s
Запрос 10000 за один раз (100 партий) = 8.4s
Запрос 100000 за раз (10 партий) = 9 с (на исходные результаты выше)

Таким образом, похоже, что это сладость для того, сколько значений должно быть включено в предложение $in в сравнении с количеством раундов.