如何从文档中排除某些字段

Eri*_*rik 56 javascript mongoose mongodb express

我有以下简单的shema:

 var userSchema = new Schema({
    name : String,
   age: Number,
   _creator: Schema.ObjectId
  });

  var User = mongoose.model('User',userSchema);
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建新文档并返回到客户端,但我想从一个中排除'creator'字段:

app.post('/example.json', function (req, res) {
   var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
   user.save(function (err) {
      if (err) throw err;

      res.json(200, {user: user});     // how to exclude the _creator field?
   });
});
Run Code Online (Sandbox Code Playgroud)

最后,我想发送没有_creator字段的新创建用户:

{
   name: 'John',
   age: 45
} 
Run Code Online (Sandbox Code Playgroud)

是否可以在没有额外发现请求的情况下制作猫鼬?

PS:最好是通过它

Cha*_*les 69

在模式级别上处理此问题的另一种方法是覆盖模型的toJSON.

UserSchema.methods.toJSON = function() {
  var obj = this.toObject()
  delete obj.passwordHash
  return obj
}
Run Code Online (Sandbox Code Playgroud)

我遇到了这个问题,寻找一种方法从我提供给客户端的json中排除密码哈希,并select: false破坏了我的verifyPassword函数,因为它根本没有从数据库中检索值.

  • 尝试使用UserSchema.set('toJSON',{transform:function(doc,ret,options){delete ret.password; return ret;}}); (6认同)

Xer*_*rri 56

记录的方式是

UserSchema.set('toJSON', {
    transform: function(doc, ret, options) {
        delete ret.password;
        return ret;
    }
});
Run Code Online (Sandbox Code Playgroud)

更新 - 您可能想要使用白名单:

UserSchema.set('toJSON', {
    transform: function(doc, ret, options) {
        var retJson = {
            email: ret.email,
            registered: ret.registered,
            modified: ret.modified
        };
        return retJson;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果你已经下划线/ lodash,你可以使用`_.pick` UserSchema.set('toJSON',{transform:function(doc,ret,options){return _.pick(ret,'email','注册','修改')}}) (7认同)

小智 17

当我试图找到与pymongo类似的答案时遇到你的问题.事实证明,在mongo shell中,使用find()函数调用,您可以传递第二个参数,该参数指定结果文档的外观.当您传递属性值为0的字典时,您将在此查询中出现的所有文档中排除此字段.

例如,在您的情况下,查询将如下所示:

db.user.find({an_attr: a_value}, {_creator: 0});
Run Code Online (Sandbox Code Playgroud)

它将为您排除_creator参数.

在pymongo中,find()函数几乎相同.不知道它是如何转化为猫鼬的.我认为与之后手动删除字段相比,这是一个更好的解决方案.

希望能帮助到你.

  • 绕过Mongoose似乎是近来在Mongoose做事的推荐方式.让我们想知道Mongoose是否完全胜任这项任务. (2认同)

Joh*_*yHK 13

您可以调用toObject()该文档将其转换为可以自由修改的普通JS对象:

user = user.toObject();
delete user._creator;
res.json(200, {user: user});
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,您可以通过在字段定义中包含"select:false"来隐藏架构字段. (4认同)

fer*_*sik 11

我会使用lodash实用程序.pick().忽略()

var _ = require('lodash');

app.post('/example.json', function (req, res) {
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
    user.save(function (err) {
        if (err) throw err;
        // Only get name and age properties
        var userFiltered = _.pick(user.toObject(), ['name', 'age']);
        res.json(200, {user: user});
    });
});
Run Code Online (Sandbox Code Playgroud)

另一个例子是:

var _ = require('lodash');

app.post('/example.json', function (req, res) {
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
    user.save(function (err) {
        if (err) throw err;
        // Remove _creator property
        var userFiltered = _.omit(user.toObject(), ['_creator']);
        res.json(200, {user: user});
    });
});
Run Code Online (Sandbox Code Playgroud)


Leo*_*iro 5

通过遵循MongoDB文档,您可以通过将第二个参数传递给查询来排除字段,如:

User.find({_id: req.user.id}, {password: 0})
        .then(users => {
          res.status(STATUS_OK).json(users);
        })
        .catch(error => res.status(STATUS_NOT_FOUND).json({error: error}));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,密码将从查询中排除.

字体:https://docs.mongodb.com/v2.8/tutorial/project-fields-from-query-results/#return-all-but-the-excluded-field