让我告诉你一些我的申请和问题: 这个应用程序将用于 在一个组织发起的特定课程中注册学生。除了其他信息外,学生还将在表格中提供以下内容:
表格成功提交后,他可以打印他的录取卡。
现在为管理员:
start
课程卷号的位置current
卷号学生点击提交后所采取的步骤如下:
course_id
,并获取该课程的current
卷号current
卷号作为路径course_name/batch/roll_number.(png|jpg)
forms
集合current
集合courses
卷号
问题:
问题是,如果用户几乎同时提交表单,它可以生成重复的卷号,因为他们将使用相同的current
卷号。
我无法解决此问题,因为我无法自动增加表单roll_number
因为它来自courses
集合。
这是我的数据库的样子:
{
"courses":[
{
"_id" : ObjectId,
"batches": [Object],
"course_name" : String,
"current": Number, // current roll number
"start" : Number, // starting roll number
"available": Boolean
}
],
"forms": [
{
"_id": ObjectId,
"roll_number": Number,
"course_id" : ObjectId
// other stuff
}
],
"settings": [ // always have one object
{
"_id" : ObjectId,
"accept_form": Boolean,
"courses": [ObjectId]
}
]
}
我正在使用:
用于保存图片:https://github.com/expressjs/multer
用于调整图片大小:https://github.com/lovell/sharp
表达处理请求
请告诉我该怎么做才能解决这个重复问题。
答案 0 :(得分:0)
不幸的是,在MongoDB中没有简单的方法可以做到这一点。但是,您可以使用各种策略,以确保您的表单集合中不会出现重复的卷号。
首先,确保在roll_number字段上设置了唯一索引。当您尝试插入重复值时,至少mongo会通知您。
创建一个执行以下操作的循环:
注意:根据可能同时保存表单的用户数量,上述方法可能非常详尽。但是对于具有中等数量用户的系统,具有更多一次保存操作的概率应该非常小,并且该方法应该提供可接受的结果。
另一种可行但更困难的方法是在保存表单后将滚动号分配任务传递给SINGLE后台工作线程。
在nodeJs中,可以使用优先级作业队列库轻松实现,例如Kue,默认情况下会对作业进行排队,并一次执行一个,(因此将卷号分配给一个表单)一段时间)这样你就不用担心并发了。
在典型的实现中,一旦表单对象成功保留,您将创建一个Job来分配一个卷号并将其添加到队列中。
注意:由于在响应返回给客户端后,卷号分配将在后台异步完成,您需要实现一种机制(即使用Web套接字或轮询)让客户知道何时分配了卷号并将其显示在UI上。
可能还有其他比我在此描述的更容易实现的方法。但最重要的是,这是我能想到的。
您还应该查看来自MongoDB文档 Creating and Auto-Incrementing Sequence Field 的文章