首页 > 解决方案 > 如何将 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 作为响应。

谢谢。

标签: arraysnode.jsmongooseobjectid

解决方案


推荐阅读