所以我实际上只使用了关系数据库。
现在我想用mongo做我的第一个真正的项目。 我需要基于角色的访问我的应用程序。
在关系数据库中,我可能会在我的“用户”表中添加一个列“角色”,其中“角色”由角色表引用。
对于NOSQL数据库,这可能不太合适? 换句话说,将角色存储为字符串是最佳做法吗? E.g。
var UserSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
role: { type: String }
});
或者它会是这样的:
var UserSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
role: { type: Role }
});
(如果可能的话)
答案 0 :(得分:1)
你可以拥有另一个名为authority的集合,它将不同的权限及其名称保存为字符串,如:
{
"_id": ObjectId("51644d0884969b4512"),
"authority": "ROLE_USER",
}
然后你的用户对象有一个带参考的字段
{
"_id": ObjectId("5123432969d434553"),
"password": "notSave",
"name":"user0",
"role:ObjectId("51644d0884969b4512")
}
你的代码就像
user = db.user.find({name:"user0"});
userRole = db.authority.find({"_id":user.id})
但是如果你想让所有用户都拥有角色管理员,那么你需要编写迭代代码
我的体验是,这可能会变得非常混乱,特别是在使用抽象查询迭代更多集合时,即使使用确保的索引,运行时也会越来越长,因为在单个查询中似乎不可能使用表连接,或者我没找到
然而我喜欢mongodb,也许它可以帮助你
尽管如此,您可以并且最好避免在其他集合中使用相关文档并将其存储在同一文档中 并作为一个字符串var UserSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
role: { type: String }
});