Mongoose ODM,保存前更改变量

Posted

技术标签:

【中文标题】Mongoose ODM,保存前更改变量【英文标题】:Mongoose ODM, change variables before saving 【发布时间】:2012-07-04 17:43:25 【问题描述】:

我想用 Mongoose 为我的用户文档创建一个模型层,这样做:

    验证(唯一,长度) 规范化(用户名和电子邮件转换为小写以检查唯一性) 盐生成 密码散列 (记录)

所有这些操作都需要在持久化到数据库之前执行。幸运的是 mongoose 支持验证、插件和中间件。

不好的是我找不到任何关于这个主题的好材料。 mongoosejs.com 上的官方文档太短了……

有没有人有关于 Mongoose 预操作的示例(或者一个完整的插件,如果它存在的话)?

问候

【问题讨论】:

我认为 mongoosejs.com 上的文档在这方面非常清楚。您尝试过哪些不起作用的方法? 验证部分很清楚,但在一些持久化之前不知道如何准备对象。我认为 Schema.pre('save', callback);函数可能是它,但缺少完整的示例我也不知道如何访问前函数中对象的属性 您在中间件函数中通过this 访问文档的属性。 你能把这个复制到答案中,这样我就可以标记问题已回答:) 【参考方案1】:

另一种选择是使用 Getter。这是网站上的一个例子:

function toLower (v) 
  return v.toLowerCase();


var UserSchema = new Schema(
  email:  type: String, set: toLower  
);

https://mongoosejs.com/docs/tutorials/getters-setters.html

【讨论】:

值得注意的是,如果您传递的值与指定属性的架构中定义的类型不同,则这是唯一的选择。例如。您有一个 amount 属性,该属性的类型为 number,但您传入用于处理的值是 string【参考方案2】:
var db = require('mongoose');
var schema = new db.Schema(
  foo:      type: String 
);

schema.pre('save', function(next) 
  this.foo = 'bar';

  next();
);

db.model('Thing', schema);

【讨论】:

可以注意到,“保存”的 pre 不会在更新时触发。改用“更新” @sasha 你能解释一下你的意思吗 @DipanshuMahla 有点,我目前还没有深入研究 mongoose tbh,但我的意思可能是 schema.pre('save') 函数不会触发(或不会触发) t 被执行),当数据被更新时。它可能仅在插入新数据时触发。所以当你想通过 schema.pre() 覆盖更新时,你应该使用'update'【参考方案3】:

在您的Schema.pre('save', callback) 函数中,this 是要保存的文档,在调用 next() 之前对其进行的修改会改变保存的内容。

【讨论】:

以上是关于Mongoose ODM,保存前更改变量的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 为啥要添加空白数组?

Mongoose/Mongo:更新不保存

尝试将变量保存到 GeoJSON 点时出现 Mongoose CastError

将 Mongo/Mongoose 对象保存在另一个模型中

php70-mongo 安装学说/mongodb-odm 失败

Mongoose ODM 模型创建问题