中间件"/>
Mongoose 预更新文档中间件
猫鼬版本 5.13.15
我正在尝试在文档写入(创建/更新)时设置字段(updatedBy,createdBy)的值。
作为这项努力的一部分,我创建了以下测试代码来尝试让它工作
let currentUserId = '1';
const sampleSchema = new mongoose.Schema({
color: String,
createdBy: String,
updatedBy: String,
});
sampleSchema.pre('save', async function() {
console.log('save middleware called. This constructor:', this.constructor.name);
let modifiedById = currentUserId;
if (this.isNew) {
this.createdBy = modifiedById;
}
this.updatedBy = modifiedById;
});
sampleSchema.pre('updateOne', {document: true, query: false}, async function() {
console.log('updateOne middleware called. This constructor:', this.constructor.name);
console.log('Setting `updatedBy` to ', currentUserId);
this.updatedBy = currentUserId;
});
SampleModel = mongoose.model('sample', sampleSchema)
// Create
let sampleA = new SampleModel({color: 'black'});
let saved = await sampleA.save();
console.log('saved', saved);
// updateOne
currentUserId = '4';
await saved.updateOne({color: 'green'});
saved = await SampleModel.findOne({_id: saved._id});
console.log('saved 2', saved);
输出如下:
save middleware called. This constructor: model
saved {
_id: 641cc720863a8421476a16ca,
color: 'black',
createdBy: '1',
updatedBy: '1',
__v: 0
}
updateOne middleware called. This constructor: model
Setting `updatedBy` to 4
saved 2 {
_id: 641cc720863a8421476a16ca,
color: 'green',
createdBy: '1',
updatedBy: '1',
__v: 0
}
输出表明正在调用 updateOne 中间件并且
currentUserId
值符合预期。更新将颜色字段按预期设置为 green
,但 updatedBy
字段保持不变。它应该设置为 4.
如何在updateOne预存中间件中设置文档字段的值?
回答如下:你不能调用
await saved.updateOne({color: 'green'});
saved 是一个对象而 updateOne 是一个 mongoose 操作。
我刚刚修改了您的代码并优化了查询。请参阅此处的示例:
对于创建: 其余代码是相同的,我只是为了方便起见创建了一个函数。
// Create
let saved;
async function saveFunc() {
saved = await SampleModel.create({color: 'black'});
console.log('saved', saved);
return saved;
}
输出:
save middleware called. This constructor: { color: 'black', _id: new
ObjectId("641ea7465dfaaaee0e250caa") }
modifiedById: 1
saved {
color: 'black',
_id: new ObjectId("641ea7465dfaaaee0e250caa"),
createdBy: '1',
updatedBy: '1',
__v: 0
}
更新:
代码:
// updateOne
async function updateFunc(saved) {
currentUserId = '4';
saved = await SampleModel.updateOne({_id: saved._id},{color: 'green'});
console.log('saved 2', saved);
}
输出:
updateOne middleware called. This constructor: Query
Setting `updatedBy` to 4
currentUserId: 4
saved 2 {
acknowledged: true,
modifiedCount: 1,
upsertedId: null,
upsertedCount: 0,
matchedCount: 1
}
注意:
updateOne()
始终返回确认书而不是文档。如果您想返回更新的文档,请使用 findOneAndUpdate()
和 {new: true}
作为第三个参数。
注意: 有 2 个文档,第一个仅用于创建,第二个用于创建和更新。
函数调用:
saveFunc().then((resp) => {
updateFnnc(resp)
});
如果您觉得这有帮助,请为答案点赞,以便其他人也可以使用它。
更多推荐
Mongoose 预更新文档中间件
发布评论