在保存或更新时自动设置猫鼬模式属性

Automatically set mongoose schema properties on save or update

我有一个问题.. 我如何配置我的 mongoose 模式,使其在保存 and/or 更新时设置某些字段?

这就是我想要做的。 我有一个用户模式,当创建新文档时,我希望 createdOn 字段设置为当前日期。 当现有文档更新时,我希望 updatedOn 字段设置为当前日期

// user.model.ts
import { Document, Model, model, Schema } from 'mongoose';
import PasswordUtil from '../../../util/PasswordUtil';

export interface IUser extends Document {
    username: string;
    createdOn: Date;
    updatedOn: Date;
    firstName: string;
    lastName: string;
    email: string;
    password: string;
}

const encryptPassword = (password: string) => PasswordUtil.encrypt(password);

export const UserSchema = new Schema<IUser>({
    username: {
        required: true,
        type: String,
        unique: true
    },
    createdOn: {
        required: true,
        type: Date,
        set: Date.now
    },
    updatedOn: {
        required: true,
        type: Date
    },
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true,
        set: encryptPassword
    }
});

export const UserModel: Model<IUser> = model('User', UserSchema);

我有 set: Date.now createdOn 属性。我不希望客户端发送这个值。但是由于模型中没有 createdOn,验证失败,因为我还配置了 createdOnrequired: trueupdatedOn也是如此。 这就是我现在的做法

// user.controller.ts
public createUser(request: Request, response: Response) {
    const user: IUser = request.body as IUser;

    const userSchema = new UserModel(user);
    userSchema.set('updatedOn', Date.now());
    userSchema.set('createdOn', Date.now());
    userSchema.save()
        .then((model: IUser) => ResponseHelper.responseOK(response, model))
        .catch((err: MongoError) => ResponseHelper.responseInternalServerError(response, { message: err.message }));
}

我怎样才能使设置 createdOnupdatedOn 字段的所有逻辑都驻留在模型本身中? 此外, createdOn 应在创建新模型时设置,并且 updatedOn 应在更新现有模型时设置。

在您的架构中使用 'default' (https://mongoosejs.com/docs/defaults.html)。这将设置当前创建日期。

 createdOn: {
  required: true,
  type: Date,
  set: Date.now,
  default: Date.now
},
updatedOn: {
  required: true,
  type: Date,
  default: Date.now
}

至于在 .update 上更新时间戳 - 如果你是 运行 mongoose >4.0,你可以使用时间戳

https://mongoosejs.com/docs/guide.html#timestamps

您可以将 timestamps 添加到您的架构中,它会自动创建 createdAtupdatedAt 字段,updatedAt 会在您每次更新文档时得到更新

export const UserSchema = new Schema<IUser>({/* schema */}, { timestamps: true })

您也可以像这样重命名字段

{ timestamps: { createdAt: 'createdOn', updatedAt: 'updatedOn' }}