Получение всех записей в одном запросе MongoDB

#mongodb

Вопрос:

 const arr = await ThreadModel.distinct("_id", { user_uuid: "abc" });

const events = await EventModel.find({ thread_id: { $in: arr } }).limit(10);
 

Первый запрос получает _id поле всех потоков определенного пользователя, которое возвращает массив _id s.
Затем выполняется другой запрос для получения событий потоков.

Что делать, если в первом запросе будут извлечены тысячи или миллионы записей? Будет ли это долгий процесс? Каковы альтернативы?

Обратите внимание, что я не могу использовать $lookup сцену.

$поиск
Выполняет левое внешнее соединение с неразделенной коллекцией в той же базе данных для фильтрации документов из «объединенной» коллекции для обработки
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

Комментарии:

1. Это просто пример? Если вам нужно только 10 записей, почему бы не ограничить список идентификаторов? В качестве примечания, передача тысяч идентификаторов не будет большой проблемой. Передача миллионов идентификаторов GUID означает, что у вас будет запрос объемом 100 МБ, что возможно, но это займет немного времени. Только на сетевой трафик потребуется время.

2. @TimRoberts Да, просто пример. Ну, у меня есть другой выбор: если есть 1 млн пользователей, я должен создать событие , связанное с ним миллион раз user_uuid , поэтому мне не нужен первый запрос, я могу легко сделать EventModel.find({ user_uuid: "abc" }).limit(10); это сейчас, создание 1 млн записей-еще одна головная боль. Это приложение для чата, такие события, как «удалить сообщение», «очистить историю», «изменить фотографию», хранятся в events коллекции, когда пользователи выходят в Интернет, они получают события и применяют их к своей локальной базе данных.

Ответ №1:

Связывание пользователей и потоков в реляционной базе данных решает мою проблему.
также можно писать расширенные запросы.

Ссылки:

идентификатор пользователя thread_id
А-Б-К-Д-Е 1
У-Д-Г-Р-В 5

Мероприятия:

ID thread_id данные created_at
101 1 {…} 1630355818
102 5 {…} 1630355937

SQL-запрос:

 SELECT `events`.* from `events` 
INNER JOIN `links` ON `events`.`thread_id` = `links`.`thread_id`
WHERE `links`.`user_uuid` = ? LIMIT 10