#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