Mongoose查询返回全部字段而非Schema定义字段的问题
解决Mongoose查询返回全部字段而非Schema定义字段的问题
嘿,我懂你的困惑——本来以为Schema定义了哪些字段,查询就只会返回哪些,但实际却不是这样对吧?这其实是对Mongoose Schema的作用有点误解,我来给你理清楚:
为啥会出现这种情况?
Mongoose的Schema核心是用来做数据校验、类型转换、设置默认值这些事的,它本身不会自动帮你过滤掉Schema里没声明的字段。哪怕你只定义了custom_id和name,只要数据库里的文档存了其他字段,默认查询就会把所有字段都返回给你。
怎么改成只返回指定字段?
有几个实用的方法,你可以按需选择:
1. 在find里直接加投影参数
这是最直接的方式,在find的第二个参数里明确指定要返回的字段,或者排除不需要的:
// 写法1:用字符串,空格分隔要保留的字段,-号表示排除 Business.find({custom_id: req.query.custom_id}, 'custom_id name -_id') .then(data => res.send({data})) .catch(err => next(new Error(err.message || err)))
如果觉得字符串不够清晰,也可以用对象形式:
// 写法2:对象形式,1表示保留,0表示排除 Business.find({custom_id: req.query.custom_id}, {custom_id: 1, name: 1, _id: 0}) .then(data => res.send({data})) .catch(err => next(new Error(err.message || err)))
2. 用select链式方法
和上面的效果一样,只是写法更灵活,适合需要动态调整返回字段的场景:
Business.find({custom_id: req.query.custom_id}) .select('custom_id name -_id') // 同样支持对象形式 .then(data => res.send({data})) .catch(err => next(new Error(err.message || err)))
3. 给Schema加strict: true(注意局限性)
如果你希望从根源上阻止Schema外的字段被存入数据库,可以给Schema加上strict: true(其实这是Mongoose的默认配置,除非你之前修改过):
var businessSchema = new mongoose.Schema({ custom_id: String, name: String }, { strict: true });
不过要注意:这个设置只对新保存/更新的文档生效,已经存在数据库里的旧文档的额外字段,查询时还是会返回,所以旧数据还是得用前面的投影方法过滤。
修改后你会得到这样的结果
调整完之后,查询返回的内容就只有你需要的字段了:
{ "data":[ { "custom_id":"1", "name":"Dave and Jane" } ] }
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

