Группировка участников пользователей в nodejs с помощью mongodb

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #мангуст

Вопрос:

Я новичок в MongoDB, Вот что я хочу реализовать с помощью mongoose и nodejs, как сделать группировку участников основы описания комнаты.

//вот схема

rooms.js

   //ROOMS
const schema = mongoose.Schema({
    "total_participants":{type: Number, default: 3},
    "group_id": {type:String, default: ()=>utils.randomString(16)}
}
  

participants.js

     //participants
        const schema = mongoose.Schema({
            ---,
            "group_id":String
        });
  

Код API, когда кто-то присоединяется к комнате, когда кто-то пытается присоединиться, сначала он получает groupId из комнаты и сохраняет в участники, а затем проверяет общее количество присоединенных участников в этой комнате, и если я получил полный, он генерирует новый идентификатор и обновляет в комнате

         const room= await RoomModel.findOne({_id: "5f2fde82b64b4e1c787ea611"})
        await new ParticipantsModel({"group_id": room.group_id}).save()

        const newGroupId= utils.randomString(16)
        const filled =await ParticipantsModel.countDocuments({group_id: room.group_id})
        console.log("filled " filled)
        await RoomModel.updateOne({total_participants:filled},{group_id: newGroupId}).exec()
  

Проблема, с которой я сталкиваюсь здесь, заключается в том, что когда несколько пользователей одновременно отправляют запрос на объединение, например, 50 пользователей отправляют запрос на объединение вместе, чем общее количество участников в комнате становится больше в комнате, а новый идентификатор комнаты не обновляется.

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

1. Возможно, это может вам помочь: en.wikipedia.org/wiki/Universally_unique_identifier

2. Не могли бы вы, пожалуйста, немного объяснить…

Ответ №1:

Это может быть проблемой параллелизма; к тому времени, когда вы вставляете нового участника, комната еще не помечена как заполненная, и другой может войти.

В этом случае вам нужно использовать транзакцию:https://mongoosejs.com/docs/transactions.html

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

1. Я прошел транзакции, и я прочитал, что мы можем запускать по одной транзакции за сеанс одновременно, что означает, что параллелизма не произойдет, это то, что я хочу. Но 1. не влияет ли это на производительность, и 2. что, если я использую автоматическое масштабирование с EC2… Затем для каждого изображения будет создан другой сеанс, И снова произойдет параллелизм… Итак, как облачно я решаю эти проблемы с сеансом и транзакциями