Загляните в syslog, возможно это oom-killer убивает могу когда та начинает жрать всю память (если так - то нехватка памяти), так же ещё сделайте swap если ещё нету (а если есть, что показывает?).
1 способ, отправить ассинхронно все запросы с ключом w=0 (циклом) кроме последного, который отправить с ключом w=1 - в 99% он будет отработан последим и вернет статус завершения
2 воспользоваться bulkwrite
Я бы сделал простой запрос по индексу (from-to) - получить все занятые на период. И уже на бекенде (из кеша или монги) выдал бы все что не попали в список (т.к. номеров не много).
Это один из самых производительных вариантов. А сложные запросы и запросы с отрицанием (not) часто приводят к полному перебору.
Лайки надо хранить в посте, (и можно кешировать в браузере, что-б лишний раз не нагружать сервер).
Итого, одним простым и быстрым запросом достается пост и лайки, без всяких хитроумных запросов.
На сервере где функция меняет xp, там и пусть уровень высчитывается и записывается а базу с тем же обновлением, для события - тут же проверяете изменился ли уровень и что-то делаете, например отправка сообщения клиенту.
_id - это поле для уникального индекса, т.е. монга предотвращает появление дублей.
Значит вам нужно записать туда разные значения, сейчас вы пытаетесь записать туда дубль.
Если не трогать это поле, драйвер сам должен подставить туда уникальный ObjectId.