如何从文档中排除一些字段
我有以下简单的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']); //你已经完成了