猫鼬文档过滤属性

mongoose document filtering properties

我已经定义了一个架构

var UserSchema = new Schema({
  firstName: { type: String, required: true },
  lastName: { type: String, required: true },
  email: { type: String, required: true },
  location: { type: String, required: true },
  picture: { type: String, required: true },
  passwordHash: { type: String, required: true },
  resetPasswordToken: String,
  resetPasswordExpired: Boolean
});

我有一个 REST 端点,其中包含所有用户的 return 列表。在该列表中,我想隐藏一些属性,即 passwordHash, resetPasswordToken, resetPasswordExpired

我定义了一个自定义过滤器函数,如下所示

var doFilterUser = function(user) {
  _.omit(user, ['passwordHash', 'resetPasswordToken', 'resetPasswordExpired']);
   user.id = user._id;
   delete user._id;
   delete user.__v;
   return user;
};

_ 是 lodash

当我检查我的 API 正在响应所有用户属性时

这个过滤器函数定义在通用辅助模块中,我这样调用它

User.findOne({_id: id}, function(err, user) {
  var filtered = helper.doFilterUser(user);
});

如何解决这个问题?

这里的问题是您仍然有一个符合 s 严格模式的猫鼬文档。如果您想更改该文档,则需要将其设为 "raw" 没有所有附加控件的对象:

User.findOne({_id: id}, function(err, user) {
  var filtered = helper.doFilterUser(user.toObject());
});

因此此处的 .toObject() 方法将 return 原始形式的对象。这使您可以随心所欲地操作按键。

试试这个: 您可以通过猫鼬访问某些值。

User.findOne({_id: id}, 'firstName lastName email location picture', function(err, user){
  console.log(user);

});

你只是在查询之后提到需要的字段。

希望对您有所帮助....

您也可以明确指示它不返回某些属性。如果您不想通过网络呈现散列密码,则很有用。查找方法如下所示:

User.find({}, '-id -__v',function(err,users){
})

User.findOne({_id: id}, '-id -__v',function(err,user){
})