arrays - 如何将 ObjectId 引用的数组发布到节点 js 中的现有集合
问题描述
我是 Mongodb 和 nodejs 的新手。我的问题是关于在 mongodb 中对集合执行 post 操作,该操作将 ObjectId 引用存储到另一个集合。
确切的场景是:
我在用户文档中有一组注册用户。同样,我在 Roles 文档中有一组可用的角色。
现在,我要做的是向用户发布角色文档中的角色。一个用户可以有多个角色,因此我想将所有 ObjectId 引用存储到用户文档中的角色。
我对用户和角色文档有以下定义。
var roleSchema = new mongoose.Schema({
roleId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Roles'
}
});
const userSchema = new mongoose.Schema({
Username: {
type: String,
required: true,
minlength: 5,
maxlength: 255,
unique: true
},
FirstName: {
type: String
},
LastName: {
type: String
},
Email: {
type: String,
required: true,
minlength: 5,
maxlength: 255
},
Password: {
type: String,
required: true,
minlength: 5,
maxlength: 1024
},
Roles: [roleSchema],
Active: {type: Boolean, default: true},
SuperUser: {type: Boolean, default: false}
},{
timestamps: true
});
const rolesSchema = new mongoose.Schema({
RoleName: {
type: String,
required: true,
minlength: 5,
maxlength: 255,
unique: true
},
Description: {
type: String
},
Active: {type: Boolean, default: true}
}, {
timestamps: true
});
router.post('/', [auth, admin], async (req, res) => {
const { error } = validate(req.body);
if (error) return res.status(400).send(error.details[0].message);
let user = await User.findOne({ Username: req.body.Username });
if (user) return res.status(400).send('User with username: ', req.body.Username, 'already exists. Please try with any other username');
// Begin: Code added to populate Roles in Users document. Look up the roles information in req.body payload
let rolesArray = {};
if(req.body.Roles !== null) {
req.body.Roles.forEach(element => {
objectId = mongoose.Types.ObjectId(element);
const roleInfo = Roles.findById(objectId);
if (!roleInfo) return res.status(400).send('Invalid Role in Input.');
});
}
console.log('Roles : ', rolesArray);
user = new User(_.pick(req.body, ['Username', 'FirstName', 'LastName' ,'Email', 'Password', 'Active','SuperUser', 'Roles']));
rolesArray.forEach(role => {
console.log('Role in user : ', role);
user.Roles.push = role;
});
// End: Code added to populate Roles in Users document. Look up the roles information in req.body payload
const salt = await bcrypt.genSalt(10);
user.Password = await bcrypt.hash(user.Password, salt);
await user.save();
const token = user.generateAuthToken();
res.header('x-auth-token', token).send(_.pick(user, ['_id', 'FirstName', 'LastName' ,'Email', 'Roles']));
});
我已经附上了 POST 操作的代码,但即使这样也不起作用。如果 POST 操作成功,我可以进行 PUT 操作。
尽管我进行了所有尝试,但我无法理解如何遍历 req.body.Roles 以在用户文档中设置 ObjectIds。
此外,在执行 GET 操作时,我希望在查询用户文档时检索角色名称和角色 ID 作为响应。
谢谢。
解决方案
推荐阅读
- android - 远程调试 JS 未显示在 Android Stuido 中模拟器的开发人员工具选项中
- c# - 如何在 c# 中使用方法?
- authentication - swagger(anyOf 或 oneOf)中的多重身份验证应该使用什么?
- laravel - 如何在没有 ssh 的共享主机上解决 laravel 中的图像上传问题?
- email - SOA DNS 记录中可以包含多少个电子邮件地址?
- javascript - 从顶部 10rem 向下滚动
- flutter - Flutter:将数据发送到父页面并重新加载
- matlab - 无法运行 Matlab 控制器
- elasticsearch - 使用 docker 在弹性堆栈中设置 ILM
- linux - 使用 bash 自动安装脚本