Как получить документ _id в мангусте до хука updateOne?

Я делаю 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!' } }),
);

Но я не могу найти способ получить идентификатор документа, который обновляется в настоящее время. Вот рабочий тестовый скрипт: .github.com/YuriGor/04192230fb63542c1af5ff5c19b3a724

Примечание: в реальной жизни это произойдет внутри плагина mongoose, поэтому я не могу просто сохранить doc _id в какую-то переменную в родительской области, как я делаю в этом скрипте.


person Yuri Gor    schedule 15.10.2018    source источник


Ответы (1)


Большое спасибо 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!' } }
);
person Yuri Gor    schedule 18.10.2018