如何防止将架构字段插入子文档中?

时间:2019-03-29 04:40:42

标签: node.js mongodb mongoose

我正在用node js和vue制作约会应用程序,并且一切正常,但是我希望排除在创建对话后将密码插入子文档中的可能性。现在,我知道我可以在使用.select('-password')时说User.findOne(),但是当将用户架构作为子文档添加到我的“对话”架构时,它没有用,它具有user_one和user_two,每个都引用用户架构。我需要密码字段,因此在创建架构时不能忽略它。现在,我的代码如下:

User.findOne({ _id: fromUserId }, (errUserOne, userOne) => {
        User.findOne({ _id: toUserId }, (errUserTwo, userTwo) => {
          conversation = new Conversation({
            _id: mongoose.Types.ObjectId(),
            user_one: userOne,
            user_two: userTwo
          });

          conversation.save();

          const message = new Message({
            _id: mongoose.Types.ObjectId(),
            conversation_id: conversation._id,
            message: req.body.message,
            user_id: fromUserId
          });

          message.save();

          res.sendStatus(201);
        });
      });

但是此代码将密码保存到“对话”集合中,我不需要。

1 个答案:

答案 0 :(得分:0)

User.find({ _id: :{ $in : [fromUserId,toUserId] }, { password:0 } , (err, userArray) => {
  //your code goes here
});

两件事,您要查询两次以获取用户。您可以将其合并为单个查询,并且要排除密码字段,可以传递{password:0}。它将排除在文档之外。

在定义Conversation模式时,也不要使user_oneuser_two类型的用户。而是只定义要保存的用户的任何属性,例如:

var Conversation = new Schema({
   _id   : ObjectId, 
  user_one : {
   _id: ObjectId,
   //all other fields
  },
  user_two : {
   _id: ObjectId,
   //all other fields
  },
});