如何确保两个用户没有获得相同的广告代码?

时间:2017-08-14 09:38:37

标签: mongodb express mongoose multer sharp

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

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

表格成功提交后,他可以打印他的录取卡。

现在为管理员:

  • 他可以创建任意数量的课程
  • 他可以切换课程' availablibility
  • 他可以选择start课程卷号的位置
  • 他可以更改课程的current卷号

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

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

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

    表达处理请求

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

1 个答案:

答案 0 :(得分:0)

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

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

方法#1

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

  1. 从课程集合中读取当前的卷号,然后添加到表单对象
  2. 尝试保存表单对象并检查mongo db是否返回重复错误
  3. 如果已使用滚动编号,请增加课程当前编号
  4. 重复步骤1
  5. 注意:根据可能同时保存表单的用户数量,上述方法可能非常详尽。但是对于具有中等数量用户的系统,具有更多一次保存操作的概率应该非常小,并且该方法应该提供可接受的结果。

    方法#2

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

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

    在典型的实现中,一旦表单对象成功保留,您将创建一个Job来分配一个卷号并将其添加到队列中。

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

    可能还有其他比我在此描述的更容易实现的方法。但最重要的是,这是我能想到的。

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