我必须制作一个页面,用于输入有关特定区域内人员的一些数据。每个用户都将在特定区域享有特权。
因此,我将两个集合放入数据库。一种用于用户,另一种用于区域。
用户将只能访问一个区域(在某些情况下甚至可以访问更多区域)和特定的附件,例如读取或写入,或读取和写入等。
如何为架构建模,以便可以添加更多区域?
这就是我的做法:
var mongoose = require("mongoose"),
passportLocalMongoose = require("passport-local-mongoose");
let userSchema = new mongoose.Schema({
username:
{type: String,
unique: true
},
password: String,
privileges:
{
regiune: [Number],
read: [Number],
write: [Number],
edit: [Number]
}
});
userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", userSchema);
但是我不知道如何编辑该模型,以便它可以具有多个具有不同特权的区域。 假设,对于普通用户,他们可能只有一个区域具有读取,写入和编辑功能。但是,如果我希望其他用户可以访问具有读取,写入权限的区域x和具有写入权限的区域y,则无法使用此模式来做到这一点。
那么我应该如何编辑呢? (也是,我是数据库的初学者,所以如果还有另一种更好的设置权限的方法,请告诉我)
谢谢!
答案 0 :(得分:1)
实际上,由于特权字段属于每个用户,因此您可以轻松地拥有多个具有不同特权的区域
将特权转换成数组,将每个特定的许可转换成数字,就可以了!
privileges:
[{
regiune: Number,
read: Number,
write: Number,
edit: Number
}]
对象数组是在Mongo中建模依赖对象的惯用方式。人们通常建议不要将无界数组作为子文档,但是我敢打赌,您的区域列表相对有限。
您可能需要引入一些机制,以确保阵列中具有唯一的注册表。 Mongo 4.10为此引入了一个插件:https://www.npmjs.com/package/mongoose-unique-array,您可以像这样使用:
privileges:
[{
regiune: { type: Number, unique: true },
read: Number,
write: Number,
edit: Number
}]
如果您想通过键(区域1,区域3等)作为对象访问权限,则可以将特权声明为混合类型,这意味着它可以是任何任意json结构(但会丢失类型信息)。或者,您可以使其成为一个单独的模型,并带有对用户对象的反向引用的集合。用户对象还可以具有对该新模型的引用列表(但它还是一个数组,而不是一个对象)。