使用 Mongoose 审查 MongoDB 字段
Posted
技术标签:
【中文标题】使用 Mongoose 审查 MongoDB 字段【英文标题】:Censoring MongoDB fields with Mongoose 【发布时间】:2015-12-09 21:47:06 【问题描述】:我正在考虑使用 Mongoose ORM 审查某些 MongoDB 字段的最佳方法。有
const userSchema = new Schema(
last_name:
type: String,
select: false,
);
userSchema.virtual('last_name_initial').get(function ()
return this.last_name.substr(0,1).toUpperCase();
);
不会这样做,因为last_name
被设置为select: false
,显然我不想发回last_name
【问题讨论】:
github.com/Automattic/mongoose/issues/1195 【参考方案1】:当您在架构中的任何字段上指定 select: false
时,默认情况下该字段在查询中被排除。因此,在这种情况下,您的虚拟字段将仅适用于像这样查询过的对象:
User.find().select('+last_name').exec(function (err, users)
//The virtual field should be available here.
console.log(users[0].last_name_initial);
);
如果您希望虚拟字段始终可用,而不必明确包含要选择的字段,那么最好使用其他方法而不是select: false
。
您可以默认排除该字段的一种方法是覆盖 toJSON
方法(source 和您有同样的问题)
userSchema.methods.toJSON = function()
var obj = this.toObject()
delete obj.last_name
return obj
注意:使用这种方法,您还应该为 toJSON 设置选项 virtuals: true。
userSchema.set('toJSON', virtuals: true);
【讨论】:
尝试你的答案不起作用,因为覆盖 toJSON 不包含虚拟字段,所以我最终删除了虚拟字段并执行:userSchema.methods.toJSON = function() let obj = this.toObject(); obj.last_name_initial = obj.last_name.substr(0,1).toUpperCase();delete obj.last_name;return obj;;
是的......这也很好......将检查 toJSON 的虚拟选项以上是关于使用 Mongoose 审查 MongoDB 字段的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB (Mongoose) 如何使用 $elemMatch 返回所有文档字段
使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段
使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段