Mongoose 预更新文档中间件 - 更改的字段未写入数据库

问题描述 投票:0回答:1

猫鼬版本 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预存中间件中设置文档字段的值?

javascript node.js mongodb mongoose mongoose-schema
1个回答
0
投票

你不能调用

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)
});

如果您觉得这有帮助,请为答案点赞,以便其他人也可以使用它。

© www.soinside.com 2019 - 2024. All rights reserved.