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

我有以下简单的shema:

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

我想要做的是创build新的文档,并返回到客户端,但我想从一个排除“创build者”字段:

 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? }); }); 

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

 { name: 'John', age: 45 } 

是否有可能没有额外的查找请求mongoose?

PS :最好是通过

在模式级别处理这个的另一种方法是覆盖模型的JSON。

 UserSchema.methods.toJSON = function() { var obj = this.toObject() delete obj.passwordHash return obj } 

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

logging的方式是

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

更新 – 你可能想要使用一个白名单:

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

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

以你的情况为例,查询就像

 db.user.find({an_attr: a_value}, {_creator: 0}); 

它会为你排除_creator参数。

在pymongo中,find()函数几乎是一样的。 不知道它是如何翻译为mongoose,但。 我认为这是一个更好的解决scheme,相比之下手动删除字段。

希望能帮助到你。

我会使用lodash公用事业.pick()或.omit()

 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}); }); }); 

另一个例子是:

 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}); }); }); 

您可以调用文档上的toObject()将其转换为一个纯JS对象,您可以自由修改:

 user = user.toObject(); delete user._creator; res.json(200, {user: user}); 

我正在使用Mongoosemask,我非常满意。

它支持根据您的需要隐藏和显示其他名称的属性

https://github.com/mccormicka/mongoosemask

var maskedModel = mongomask.mask(model,['name','age']); //你已经完成了