创建 Mongoose/MongoDB 常量文档

Posted

技术标签:

【中文标题】创建 Mongoose/MongoDB 常量文档【英文标题】:Creating Mongoose/MongoDB constant documents 【发布时间】:2019-06-09 17:51:36 【问题描述】:

我正在尝试对我正在编写的 NodeJS 程序实施一种基于角色的访问控制。这些角色将使用 Mongoose 与所有其他数据一起存储在 MongoDB 数据库中。 RoleSchema 就是为此目的而创建的。角色有一个字符串类型的名称,以及一个包含角色权限的字符串类型的数组。我已经在下面发布了该代码。

对于我的 API,我要实现三个角色,用户、作者和管理员,每个角色都有不同的权限。在集合中只创建一次这些文档的最佳方法是什么?我知道我可以简单地手动创建条目,但我觉得编程解决方案会更好。是否像检查角色是否已经创建,如果没有创建角色那么简单,还是有更好的方法?

const RoleSchema = new Schema(
    role: 
        type: String,
        default: "user",
    ,
    permissions: 
        type: [String]
    
)

const RoleModel = mongoose.model('roles',RoleSchema)
RoleModel.create(
    role: 'user',
    permissions: ['readPost', 'commentPost', 'votePost']
, (error, result) => )

【问题讨论】:

【参考方案1】:

播种

因此,为数据库播种是一个将一组初始数据提供给数据库的过程。

作为最佳实践,您应该配置种子数据以自动插入文档,而不是手动插入数据。

var seeder = require('mongoose-seed');

// Connect to MongoDB via Mongoose
seeder.connect('mongodb://localhost/yourDatabase', function() 

// Load Mongoose models
seeder.loadModels([
    'models/roles.js'
]);

// Clear specified collections
seeder.clearModels(['roles'], function() 

// Callback to populate DB once collections have been cleared
seeder.populateModels(data, function() 
        seeder.disconnect();
     );

  );
);

// Data array containing seed data - documents organized by Model 
var data = [
   
      'model': 'role',
      'documents': [
          
              'role': 'user',
              'value': ['readPost', 'commentPost', 'votePost']
          ,
              'role': 'another role',
              'value': ['updatePost', 'deletePost']
          
       ]
   
];

将该代码放在seed.js 文件中并运行它。


mongoose-seed library

【讨论】:

【参考方案2】:

假设角色名称是唯一的,你确实可以查询数据库并检查是否已经存在同名角色。如果没有,我们继续创建角色。

这对我很有效:

const createRole = async (role, permissions) => 
    const matches = await RoleModel.find(role).exec();

    if (matches.length === 0) 
        return RoleModel.create(role, permissions);
    
;

然后可以通过以下方式调用该方法(假设您已经连接到数据库):

const userRole = 
    role: "User",
    permissions: ["readPost", "commentPost", "votePost"]
;

(async () => 
    await createRole(userRole);
    console.log("User role has been created successfully.");
)()

【讨论】:

以上是关于创建 Mongoose/MongoDB 常量文档的主要内容,如果未能解决你的问题,请参考以下文章

唯一索引不适用于 Mongoose / MongoDB

Mongoose/MongoDB:获取倒数第二个文档

通过在 body、mongoose/mongodb 中提供文档来更新多个文档

Nodejs之MEAN栈开发---- 使用MongoDB和Mongoose创建数据模型及API

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?