Javascript 如何在MongoDB中植入角色和功能

Javascript 如何在MongoDB中植入角色和功能,javascript,node.js,mongodb,docker-compose,mongoose-schema,Javascript,Node.js,Mongodb,Docker Compose,Mongoose Schema,我刚开始使用MongoDB和Docker,我正在使用一个应用程序,无法找到更微妙的方法来使用npm run命令为我的数据库添加种子。首先,我创建了一个名为seed.js的文件,然后将其与package.json文件上的npm run seed命令相关联 在seed.js文件中,我导入了Mongoose和模型,但我需要做的两件事是: 创建角色,如果它们还不存在 创建功能(如果功能尚不存在),并将其与 角色 我要创建的角色有: 管理员(说明:管理员) 查看器(说明:查看器) 能力 我

我刚开始使用MongoDB和Docker,我正在使用一个应用程序,无法找到更微妙的方法来使用npm run命令为我的数据库添加种子。首先,我创建了一个名为seed.js的文件,然后将其与package.json文件上的npm run seed命令相关联

在seed.js文件中,我导入了Mongoose和模型,但我需要做的两件事是:

  • 创建角色,如果它们还不存在

  • 创建功能(如果功能尚不存在),并将其与 角色

我要创建的角色有:

  • 管理员(说明:管理员)

  • 查看器(说明:查看器)

能力

我需要检查需要身份验证的用户服务的每个端点,并创建适当的功能。示例:updateUser更新用户数据。这可以由自己的用户(因此必须具有UpdateUserWn功能)和管理员(具有updateUsers功能)完成。我必须分析每个端点并判断什么是足够的,但我仍然无法找到将初始角色和功能添加到数据库的方法

更新: 在种子设定本身上,更新后的解决方案是有效的,但它需要大量代码和重复,这些代码和重复可能会被循环修复。我想首先创建角色,这意味着使用要创建的角色中的数据创建一个包含对象的数组。每个角色都有字段role和description

const userRole=[{
角色:管理员
说明:管理员
},
{
角色:观众
描述:查看器

}]
总体而言,您走的是正确的道路

因为功能被用作引用,所以在将它们分配给角色之前,您必须获取或创建它们(获取引用)

这可能是您的种子逻辑:
const任务=[
Capability.findOneAndUpdate(
{name:'updateUserOwn'},//匹配或创建此功能
{capability:'updateUser'},//将其添加到对象中
{upsert:true,new:true}/`new`保证始终返回对象
}).exec(),
Capability.findOneAndUpdate(
{name:'updateUsers'},
{能力:'updateUser'},
{upsert:true,new:true}
}).exec(),
//播种更多。。。
];
常数[
updateUserOwn,
更新者,
]=等待承诺。所有(任务);
//我们可以对第二个事务使用批量写入,这样它可以一次性运行
等待角色.bulkWrite([
{ 
更新日期:{
筛选器:{role:'Admin'},
更新:{capabilities:[updateUsers]},
厄普塞特:没错,
}
},
{ 
更新日期:{
筛选器:{role:'Viewer'},
更新:{capabilities:[updateUserOwn]},
厄普塞特:没错,
}
}
]);
我们使用一个接一个的种子功能,这样我们就可以获得我们打算在角色上使用的每个功能的引用

然后,我们使用种子的角色

我可能已经交换了这些功能和它们的名称,但我希望您能了解大致情况



如果不涉及引用,种子将更简单-您可以一次使用
bulkWrite
所有内容,但为了创建具有内部引用的对象或向此类对象添加引用,您首先需要具有实际引用,总体而言,您的路径是正确的

因为功能被用作引用,所以在将它们分配给角色之前,您必须获取或创建它们(获取引用)

这可能是您的种子逻辑:
const任务=[
Capability.findOneAndUpdate(
{name:'updateUserOwn'},//匹配或创建此功能
{capability:'updateUser'},//将其添加到对象中
{upsert:true,new:true}/`new`保证始终返回对象
}).exec(),
Capability.findOneAndUpdate(
{name:'updateUsers'},
{能力:'updateUser'},
{upsert:true,new:true}
}).exec(),
//播种更多。。。
];
常数[
updateUserOwn,
更新者,
]=等待承诺。所有(任务);
//我们可以对第二个事务使用批量写入,这样它可以一次性运行
等待角色.bulkWrite([
{ 
更新日期:{
筛选器:{role:'Admin'},
更新:{capabilities:[updateUsers]},
厄普塞特:没错,
}
},
{ 
更新日期:{
筛选器:{role:'Viewer'},
更新:{capabilities:[updateUserOwn]},
厄普塞特:没错,
}
}
]);
我们使用一个接一个的种子功能,这样我们就可以获得我们打算在角色上使用的每个功能的引用

然后,我们使用种子的角色

我可能已经交换了这些功能和它们的名称,但我希望您能了解大致情况



如果没有涉及到引用,seed会更简单-您可以一次使用
bulkWrite
所有内容,但为了创建具有内部引用的对象或添加对此类对象的引用,您首先需要具有实际引用,您可以创建静态映射和循环,这样可以稍微减少代码,并使事情变得更简单。这还允许您跳过已存在的种子设定项

因为功能是通过角色重用的,所以我想先创建它们,但是改变逻辑先创建角色,然后再创建功能是没有问题的,尽管这可能不是那么简单

此外,每个功能都必须有一系列它必须关联的角色

这称为“多对多”关系(因为角色也有一系列对功能的引用),这只会使逻辑复杂化。你确定你真的需要它吗?mongoose/monogo不会自动为你管理它:

  • 向角色添加功能时,还需要在capability.roles内同步并添加角色-手动
  • 相反,在capability.roles中添加一个角色。您需要将此同步,并手动将此功能添加到role.capabilities中
  • 删除功能或角色也一样-手动