Mongoose模式安全字段

Mongoose模式安全字段,mongoose,Mongoose,简明扼要:有没有办法阻止设置模式字段,但允许获取值 我一直在搜索,但找不到我要找的内容。将字段定义为getter,而不是传统字段 例如,假设您希望在通过Mongoose访问时,将收藏的pop字段设置为只读: var模式=新模式({ 城市:字符串, 状态:字符串 }); schema.virtual('pop').get(函数(){ 返回此文件。\u doc.pop; }); 通过访问模型实例的私有\u doc成员,将来可能会出现问题,但在我刚刚测试时效果良好。如果要设置一个永远无法更改的默认值

简明扼要:有没有办法阻止设置模式字段,但允许获取值

我一直在搜索,但找不到我要找的内容。

将字段定义为getter,而不是传统字段

例如,假设您希望在通过Mongoose访问时,将收藏的
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
)中的
指的是查询,而不是文档。有关详细信息,请参阅文档中的最后一位。