Mongoose模式安全字段
简明扼要:有没有办法阻止设置模式字段,但允许获取值 我一直在搜索,但找不到我要找的内容。将字段定义为getter,而不是传统字段 例如,假设您希望在通过Mongoose访问时,将收藏的Mongoose模式安全字段,mongoose,Mongoose,简明扼要:有没有办法阻止设置模式字段,但允许获取值 我一直在搜索,但找不到我要找的内容。将字段定义为getter,而不是传统字段 例如,假设您希望在通过Mongoose访问时,将收藏的pop字段设置为只读: var模式=新模式({ 城市:字符串, 状态:字符串 }); schema.virtual('pop').get(函数(){ 返回此文件。\u doc.pop; }); 通过访问模型实例的私有\u doc成员,将来可能会出现问题,但在我刚刚测试时效果良好。如果要设置一个永远无法更改的默认值
pop
字段设置为只读:
var模式=新模式({
城市:字符串,
状态:字符串
});
schema.virtual('pop').get(函数(){
返回此文件。\u doc.pop;
});
通过访问模型实例的私有
\u doc
成员,将来可能会出现问题,但在我刚刚测试时效果良好。如果要设置一个永远无法更改的默认值,可以选择:
var schema = new Schema({
securedField: {
type: String,
default: 'Forever',
set: function (val) { return this.securedField; }
});
您只需从设置返回与默认值相同的值,无需参考本文档中的_:
var schema = new Schema({
securedField: {
type: String,
default: 'Forever',
set: () => 'Forever'
});
从mongoose 5.6开始,您可以执行以下操作:
immutable:true
var schema = new Schema({
securedField: {
type: String,
default: 'Forever',
immutable: true
}
});
这是怎么回事?virtuals不会被持久化,对吗?@sidgate这是一个古老的答案,对于暴露一个未在模式中定义但存在于底层文档中的字段来说,这是一个小技巧。因此,您认为虚拟现实不会持久化是对的,但由于
pop
字段已经存在,它可以工作,因为原始文档可以通过(未记录的)\u doc
字段获得。在Mongoose 5.0.15中似乎不再工作。值已正确设置为“securedField”:“Forever”但FindByiandUpdate(…)更改它。@jfrobishow这是由于Mongoose 5中的更改引起的,其中查询的setters(findByIdAndUpdate
)中的此
指的是查询,而不是文档。有关详细信息,请参阅文档中的最后一位。