我为我的模型执行updateone,并在我的方案上使用pre-updateone钩子,如下所示:

const schema = new mongoose.Schema({ name: { type: String } });
schema.pre('updateOne', async function() {
  fs.writeFileSync('./query.json', stringify(this, null, 2), 'utf-8');
});
const Model = mongoose.model('Model', schema);
let res = await Model.create({
  name: "I'll be updated soon",
});
console.log(res.name, res._id);
await Model.updateOne(
  ({ _id: res._id }, { $set: { name: 'I was updated!' } }),
);

但我找不到任何方法来获取当前更新的文档ID
下面是一个工作测试脚本:
https://gist.github.com/YuriGor/04192230fb63542c1af5ff5c19b3a724
注意:在现实生活中,这将发生在Mongoose插件中,因此我不能像在这个脚本中那样将doc\u id保存到父作用域中的某个变量中。

最佳答案

非常感谢vkarpov15
他在我的代码中发现了一个输入错误:updateOne调用中有双括号,这就是为什么查询中没有条件
所以正确的代码应该是:

const schema = new mongoose.Schema({ name: { type: String } });
schema.pre('updateOne', async function() {
  console.log('query criteria',this.getQuery());// { _id: 5bc8d61f28c8fc16a7ce9338 }
  console.log(this._update);// { '$set': { name: 'I was updated!' } }
  console.log(this._conditions);
});
const Model = mongoose.model('Model', schema);
let res = await Model.create({
  name: "I'll be updated soon",
});
console.log(res.name, res._id);
await Model.updateOne(
  { _id: res._id }, { $set: { name: 'I was updated!' } }
);

关于node.js - 如何在mongoose pre updateOne钩子(Hook)中获取文件_id?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52813100/

10-12 22:35