在套接字事件上更新 MongoDB 数据

Update the MongoDB data on a socket event

我正在使用 React 和 Node.js 构建消息传递应用程序。数据建模并存储在 MongoDb 中。我正在使用猫鼬进行数据库连接。我成功地能够在 api 调用(/getChannels)上显示数据。

app.get("/api/getChannels",cors(corsOptions), async (req,res,next) => {
    let try_channels = await Chat.find((c) => {
        return c
    });
   res.send({
       channels: try_channels
    });
})

但我想更新 mongoDB 中特定频道的套接字事件(“channel-join”)中的数据,当单击任何所需的频道时,该事件来自客户端。

    const handleSelect = (id) => {
        let selected_channel = channels.find((c) => {
            return c. id === id
        })
        setChannel(selected_channel)
     
        socket.emit("channel-join", id, ack => {
    });
 };

在服务器端我正在侦听事件并希望更新 mongodb 中的数据以显示我已加入特定频道。我能够通过在我的 server.js 文件中使用以下逻辑

的频道数组来做到这一点
 socket.on('channel-join',id =>{
        console.log('channel-join',id)
        STATIC_CHANNELS.forEach(c => {
            if (c.id === id) {
                if (c.sockets.indexOf(socket.id) == (-1) ) {
                    console.log(socket.id)
                    c.sockets.push(socket.id);
                    c.participants++;
                    console.log(c.sockets,c.participants)
                    io.emit('channel' , c)
                }
            }else {
                let index = c.sockets.indexOf(socket.id);
                console.log(index)
                if (index != (-1) ) {
                    c.sockets.splice(index , 1)
                    c.participants--;
                    console.log(c.sockets,c.participants);
                    io.emit('channel',c);
                }
            }
        })
    })

但我无法让它处理 mongodb 中的数据。我应该先将所有数据获取到一个数组然后再使用它吗??但这首先会抵消使用数据库的意义,不是吗? 我应该做类似 mongoose_model.findAndUpdate() 的事情吗?那行得通吗??

你可以这样做来获得一个 participants 计数器,并在每次有新客户端加入套接字时递增它。

await db.collection('sockets').findOneAndUpdate(
  { channelId: channelId },
  { $inc: { participants: 1 } },
  { upsert: true, returnOriginal: false }
)