javascript - 使用 mongodb 在 nodejs 上对用户的参与者进行分组
问题描述
我是 MongoDB 的新手 这是我想使用 mongoose 和 nodejs 实现的东西 如何对房间描述进行分组的参与者基础知识。
//这里是架构
房间.js
//ROOMS
const schema = mongoose.Schema({
"total_participants":{type: Number, default: 3},
"group_id": {type:String, default: ()=>utils.randomString(16)}
}
参与者.js
//participants
const schema = mongoose.Schema({
---,
"group_id":String
});
API代码,当有人加入房间时,当有人首先尝试加入时,它会从房间中获取groupId并保存在参与者中,然后检查该房间中加入的参与者总数,如果我满了,它会生成一个新的ID并更新在房间里
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 个用户发送加入请求时,房间中的参与者总数比房间中的参与者更多,而新房间 Id 没有得到更新。
解决方案
这可能是一个并发问题;当您插入新参与者时,房间尚未标记为已满,另一个可以进入。
在这种情况下,您需要使用事务:https ://mongoosejs.com/docs/transactions.html
推荐阅读
- java - 用完短值来检测 LIBGDX 中的冲突
- ruby - 使用 Azure 数据工厂 v2 在本地服务器上调用 Ruby 脚本或可执行文件?
- android - Android 7.1.1 推送通知和 FirebaseMessagingService 不起作用
- html - HTML Sketchapp - 安装后如何正确使用
- python - 在 python 中寻找多个 API 调用的样本
- email - 使用 Sieve 将日期标题添加到传入的电子邮件
- c# - 比较数组而不使用 linq
- javascript - 我想根据文本值更改表格循环中文本的颜色
- azure - 从传递给 Azure 数据工厂 v2 管道的运行时参数生成和存储 JSON 文件?
- java - Java将Mysql查询结果放入multimap