Вам нужно делать не insert а updateOne
и лучше использовать bulk operations (собрали в кучку и выполнили одним запросом)
Если levelCurve хранится в базе, то агрегацией можно получить только те записи которые подходят по критерии (смотреть на $lookup stage)
findByIdAndUpdate
Предполагается хранить каждый чат в одном документе? Ограничение на один документ будет мешать большим чатам
Я бы сделал примерно так:
1. Redis - тут кеш последних n сообщений
2. Коллекция чатов в которой 1 запись чата хранится в одном документе примерно с такой структурой:
chat_id
user_id
timestamp
status
message