用mongoose进行build筑投票的“正确方法”?

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

Root问题:在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)指导欢迎这一个),即Thing.options.votes.indexOf(username)或类似的东西。

  2. 将投票信息存储在已经存在的User模式中,然后必须search所有用户的投票数据,并将其粘贴在一起,每次我想查询一个单一的Thing 。 这似乎也是效率低下/资源密集型/比必要更复杂。

  3. 创build一个单独的Vote模式,可以更方便地存储数据,但是会添加另一个数据库调用(一个用于Thing ,一个用于Vote )。

这个问题有些复杂的事实,有不同的投票方式,这是最简单的。

研究…为了后代的缘故:

这个问题解决了数据库中的投票问题 ,但是关系数据库,而不是MongoDB / Mongoose。

这个问题解决了Mongoose / Node.js应用程序体系结构,但没有任何投票。

这个NPM模块增加了对Mongoose模式的投票,但并不完全符合我的需求。

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

作为一个快速提示 – 为了防止从DB泄漏IP地址 – 我会build议添加额外的收集,将存储所有投票敏感数据,但仍然有其他投票数据在同一文件。

这在存储数据时会带来很小的开销,但是通过devise,IP信息将不会被提供给调用者,并且不需要在每次调用时进行额外的数据清理,以保护数据。