0

让我告诉你一些关于我的应用程序和问题的信息:这个应用程序将用于在组织推出的特定课程中注册学生。除其他信息外,学生将在表格中提供以下信息:

  • 可用课程中的课程
  • 他的照片

表格提交成功后,他可以打印他的准考证。

现在对于管理员:

  • 他可以创建任意数量的课程
  • 他可以切换课程的可用性
  • 他可以选择start课程的卷号
  • 他可以更改current课程的卷号

学生点击提交后的步骤如下:

  1. course_id从表格中获取,并获取该current课程的卷号
  2. 将带有卷号的图像保存current为路径中的文件名course_name/batch/roll_number.(png|jpg)
  3. 图片保存成功则获取图片,否则拒绝
  4. 调整图像大小并覆盖现有图像,如果调整大小失败则删除图像并拒绝
  5. 将学生的表格保存在forms集合中
  6. 增加该current课程在courses收藏中的卷号
  7. 发送包含表单数据的响应以及图像的 base64 字符串(将在准入卡中使用)

问题:

问题是如果用户几乎同时提交表单,它可能会生成重复的卷号,因为他们将使用相同的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]
        }
    ]
}

我在用:

multer 用于保存图像:https ://github.com/expressjs/multer

调整图像大小的锐利:https ://github.com/lovell/sharp

expressjs 用于处理请求

请告诉我应该怎么做才能解决这个重复问题。

4

1 回答 1

0

不幸的是,在 MongoDB 中没有简单的方法可以做到这一点。但是,您可以使用多种策略来确保您的表单集合中不会出现重复的卷号。

首先,确保您在 roll_number 字段上设置了唯一索引。至少 mongo 会在您尝试插入重复值时通知您。

方法#1

创建一个执行以下操作的循环:

  1. 从课程集合中读取当前卷号,并添加到表单对象
  2. 尝试保存表单对象并检查 mongo db 是否返回重复错误
  3. 如果卷号已被使用,则增加课程当前编号
  4. 重复步骤 1

注意:根据可能同时保存表单的用户数量,上述方法可能会非常详尽。但是对于具有中等用户数量的系统,在相同的几分之一秒内发生多个表单保存操作的概率应该非常小,并且这种方法应该提供可接受的结果。

方法#2

另一种可行但更困难的方法是在保存表单后将卷号分配任务传递给单个后台工作线程。

在 nodeJs 中,这可以使用优先级作业队列库(例如Kue )轻松实现,默认情况下,它将对您的作业进行排队,并一次执行一个(因此一次将卷号分配给一个表单),这样您就不必不必担心并发性。

在典型的实现中,一旦表单对象被成功持久化,您将创建一个用于分配卷号的作业并将其添加到队列中。

注意:由于在响应返回给客户端后,卷号分配将在后台异步完成,因此您需要实现一种机制(即使用 Web 套接字或轮询)让客户端知道何时分配了卷号并将其显示在 UI 上。

可能还有其他比我在这里描述的更容易实现的方法。但在我的脑海中,这是我能想到的。

您还应该查看MongoDB 文档中的文章Creating and Auto-Incrementing Sequence Field

于 2017-08-15T09:25:10.273 回答