0

所以我实际上只使用关系数据库。

现在我想用 mongo 做我的第一个真正的项目。我需要对我的应用程序进行基于角色的访问。

在关系数据库中,我可能会在我的“用户”表中放置一个“角色”列,让角色表引用“角色”。

也许这对于 NOSQL 数据库不太合适?换句话说,将角色存储为字符串是最佳实践吗?例如

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 }
    });

(如果可能的话)

4

1 回答 1

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 }
});

MongoDB和“加入”

于 2013-10-18T21:47:52.437 回答