使用Mongoose进行架构投票的“正确方法”?

时间:2016-05-28 19:21:25

标签: node.js mongodb mongoose

我正在使用Mongoose / MongoDB创建一个Web应用程序来存储将被投票的信息。我将通过投票存储用户名和IP地址(因此如果需要,选民可以更新/修改他们的投票)。

根问题:在Mongoose架构中安全架构投票的最佳方法是什么?

目前,我的架构看起来像这样(简化):

var Thing = new Schema({
  title: {
    type: String
  },
  creator: {
    type: String
  },
  options: [{
    description: {
      type: String
    },
    votes: [{
      username: {
        type: String
      },
      ip: {
        type: String
      }
    }]
  }]
});

mongoose.model('Thing', Thing);

虽然这样可以查询任何给定Thing超级容易的数据库,但由于显而易见的原因,安全问题变得更加严重 - 我不想将用户名和IP地址返回给浏览器。

问题是,我不确定哪个是将Thing数据安全地返回到浏览器的最佳/最不痛苦的方案:

  1. 循环遍历Thing.options中的每个选项,然后通过Thing.options[i].votes中的每个投票进行子循环以查找请求数据的用户投票,然后删除所有投票以摆脱其他用户数据。这似乎是非常耗费资源的,但是我找不到在子阵列中使用indexOf的方法(指导欢迎这个),即Thing.options.votes.indexOf(username)或其他类似的东西。

  2. 在已存在的User架构中存储投票信息,然后必须在所有用户中搜索投票数据,并在每次要查询单个Thing时将其全部放在一起。这似乎效率低下/资源密集程度更高/更复杂。

  3. 创建一个单独的Vote架构,可以更方便地存储数据,但随后会添加另一个数据库调用(一个用于Thing,一个用于Vote

  4. 这个问题有点复杂,因为有不同的投票方式,这是最简单的。

    研究......为了后人的缘故:

    This question解决了数据库中的投票问题,但对于关系数据库,不是MongoDB / Mongoose。

    This question解决了Mongoose / Node.js应用程序架构,但没有涉及投票。

    This NPM Module增加了对Mongoose架构的投票,但不太适合我的需求。

    This post看起来很有希望,因为作者正在做我在上面第1点所描述的内容(参见作者帖子的清单13),但他仍然创建了一个嵌套循环,从第22行开始在清单13中,循环遍历每个选项/选项,然后通过每个选项/选项的每个投票。

1 个答案:

答案 0 :(得分:1)

作为一个快速提示 - 防止从DB泄露IP地址 - 我建议添加额外的集合,它将存储所有投票敏感数据,但在同一文档中仍有其他投票数据。

这在存储数据时会产生很小的开销,但是根据设计,不会向调用者提供IP信息,也不需要在每次调用时进行额外的数据清理,以保护数据。