mongoose文档过滤属性

时间:2015-01-24 05:29:44

标签: javascript node.js mongodb mongoose mongodb-query

我定义了一个类似

的架构
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端点,它返回所有用户的列表。在该列表中,我想隐藏一些属性,即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);
});

如何解决此问题?

3 个答案:

答案 0 :(得分:5)

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

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

});

您只需在查询后提及所需的字段。

希望它有所帮助......

答案 1 :(得分:2)

这里的问题是你仍然有一个符合严格模式的mongoose文档。如果要更改该文档,则需要将其设为“原始”对象,而不使用所有其他控件:

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

因此这里的.toObject()方法将以原始形式返回一个对象。这允许您按照自己的意愿操纵键。

答案 2 :(得分:2)

您还可以明确指示它不要回送某些属性。如果您不想通过网络呈现哈希密码,则非常有用。 find方法如下所示:

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

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