使MongoDB userSchema在每个区域具有特定特权

时间:2018-12-01 19:25:40

标签: node.js mongodb mongoose mongoose-schema

我必须制作一个页面,用于输入有关特定区域内人员的一些数据。每个用户都将在特定区域享有特权。

因此,我将两个集合放入数据库。一种用于用户,另一种用于区域。

用户将只能访问一个区域(在某些情况下甚至可以访问更多区域)和特定的附件,例如读取或写入,或读取和写入等。

如何为架构建模,以便可以添加更多区域?

这就是我的做法:

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,则无法使用此模式来做到这一点。

那么我应该如何编辑呢? (也是,我是数据库的初学者,所以如果还有另一种更好的设置权限的方法,请告诉我)

谢谢!

1 个答案:

答案 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结构(但会丢失类型信息)。或者,您可以使其成为一个单独的模型,并带有对用户对象的反向引用的集合。用户对象还可以具有对该新模型的引用列表(但它还是一个数组,而不是一个对象)。