在保存或更新时自动设置猫鼬模式属性
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
,验证失败,因为我还配置了 createdOn
和 required: true
。 updatedOn
也是如此。
这就是我现在的做法
// 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 }));
}
我怎样才能使设置 createdOn
和 updatedOn
字段的所有逻辑都驻留在模型本身中?
此外, 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,你可以使用时间戳
您可以将 timestamps
添加到您的架构中,它会自动创建 createdAt
和 updatedAt
字段,updatedAt
会在您每次更新文档时得到更新
export const UserSchema = new Schema<IUser>({/* schema */}, { timestamps: true })
您也可以像这样重命名字段
{ timestamps: { createdAt: 'createdOn', updatedAt: 'updatedOn' }}
我有一个问题.. 我如何配置我的 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
,验证失败,因为我还配置了 createdOn
和 required: true
。 updatedOn
也是如此。
这就是我现在的做法
// 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 }));
}
我怎样才能使设置 createdOn
和 updatedOn
字段的所有逻辑都驻留在模型本身中?
此外, 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,你可以使用时间戳
您可以将 timestamps
添加到您的架构中,它会自动创建 createdAt
和 updatedAt
字段,updatedAt
会在您每次更新文档时得到更新
export const UserSchema = new Schema<IUser>({/* schema */}, { timestamps: true })
您也可以像这样重命名字段
{ timestamps: { createdAt: 'createdOn', updatedAt: 'updatedOn' }}