Как бороться с огромным количеством сообщений группового чата в MongoDB? - PullRequest
0 голосов
/ 28 декабря 2018

Я создаю приложение чата с разными группами.Поэтому я использую коллекцию в Mongodb (один для всех групп).Это моя схема сообщений:

   const MessageSchema = mongoose.Schema({
    groupId: Number,
    userId: Number,
    messageIat: Date,
    message: String,
    reactions: []
  });

Допустим, я хочу загрузить последние 50 сообщений группы с идентификатором 10. Для сортировки сообщений я использую ObjectId по умолчанию.Я использую следующий запрос.Мне кажется, что я загружаю все сообщения группы 10, затем сортирую их, чтобы обеспечить порядок, а затем я могу ограничить результаты.Но это кажется мне не очень эффективным.Если есть много сообщений, это будет стоить довольно много времени, верно?

return Message.find({groupId:10}).sort( {_id: -1 }).limit(50)

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

Спасибо за помощь.

1 Ответ

0 голосов
/ 28 декабря 2018

Согласно документации :

Для запросов, которые включают операцию сортировки без индекса, сервер должен загрузить все документы в памяти, чтобы выполнить сортировку, прежде чем возвращать какие-либо результаты..

Итак, во-первых, обязательно создайте индекс для любого поля, по которому вы собираетесь сортировать результаты.

Также ,

Сортировка иногда может быть выполнена путем сканирования индекса по порядку.Если план запроса использует индекс для предоставления запрошенного порядка сортировки, MongoDB не выполняет сортировку в памяти набора результатов

Более того, согласно этой странице ,следующие запросы эквивалентны:

db.bios.find().sort( { name: 1 } ).limit( 5 )
db.bios.find().limit( 5 ).sort( { name: 1 } )

Наконец, , пока индексы полностью умещаются в памяти , с вашим текущим подходом все будет в порядке.В противном случае вы можете рассмотреть возможность создания разделов вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...