用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
数据到浏览器是最好的或最不痛苦的情况:
-
循环
Thing.options
每个选项,然后通过Thing.options[i].votes
每个投票子循环。投票以查找用户请求数据投下的投票,然后删除所有投票以摆脱其他用户数据。 这似乎是非常资源密集型的,但我找不到一个方法来使用indexOf在子Thing.options.votes.indexOf(username)
指导欢迎这一个),即Thing.options.votes.indexOf(username)
或类似的东西。 -
将投票信息存储在已经存在的
User
模式中,然后必须search所有用户的投票数据,并将其粘贴在一起,每次我想查询一个单一的Thing
。 这似乎也是效率低下/资源密集型/比必要更复杂。 -
创build一个单独的
Vote
模式,可以更方便地存储数据,但是会添加另一个数据库调用(一个用于Thing
,一个用于Vote
)。
这个问题有些复杂的事实,有不同的投票方式,这是最简单的。
研究…为了后代的缘故:
这个问题解决了数据库中的投票问题 ,但是关系数据库,而不是MongoDB / Mongoose。
这个问题解决了Mongoose / Node.js应用程序体系结构,但没有任何投票。
这个NPM模块增加了对Mongoose模式的投票,但并不完全符合我的需求。
这篇文章看起来很有希望,因为作者正在做上面第1点所描述的内容(参见作者post的清单13),但是他仍然创build了一个嵌套循环,从清单13的第22行开始,循环到循环通过每个选项/选项,然后通过每个选项/选项的每个投票。
作为一个快速提示 – 为了防止从DB泄漏IP地址 – 我会build议添加额外的收集,将存储所有投票敏感数据,但仍然有其他投票数据在同一文件。
这在存储数据时会带来很小的开销,但是通过devise,IP信息将不会被提供给调用者,并且不需要在每次调用时进行额外的数据清理,以保护数据。