我有一个问题。如何配置猫鼬模式,使其在保存和/或更新时设置某些字段?
这就是我想要做的。
我有一个用户架构,并且在创建新文档时,我希望将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
。
答案 0 :(得分:0)
在架构(https://mongoosejs.com/docs/defaults.html)中使用“默认”。这将设置当前的创建日期。
foo
bar
etc
---
关于更新.update上的时间戳-如果您运行的是Mongoose> 4.0,则可以使用时间戳
答案 1 :(得分:0)
您可以将timestamps
添加到架构中,它将自动创建createdAt
和updatedAt
字段,updatedAt
将在您每次更新文档时得到更新
export const UserSchema = new Schema<IUser>({/* schema */}, { timestamps: true })
您还可以像这样重命名字段
{ timestamps: { createdAt: 'createdOn', updatedAt: 'updatedOn' }}