摘要
我试图在Mongoose的findOneAndUpdate钩子中返回更新的文档。我知道它的行为,通常不会返回更新的文档,但是我正在通过findOneAndUpdate传递{new:true}。
错误
我得到的错误是我的帖子挂钩中的文档未定义。它是为“有效的代码”定义的,但是当我使用想要的实际findOneAndUpdate操作时,doc变得不确定。我认为这是因为我正在尝试更新文档中的嵌套对象,但我仍然需要能够更新嵌套对象并以某种方式使用后钩子
猫鼬模型
const apiTestArray = {
apiName: { type: String, require: false },
startStats: {
seasonStats: { type: Object, require: false },
lifeStats: { type: Object, require: false }
},
endingStats: {
seasonStats: { type: Object, require: false },
lifeStats: { type: Object, require: false }
},
startTime: { type: Date, require: false },
endTime: { type: Date, require: true },
completed: { type: Boolean, require: false }
};
const apiTestSchema = mongoose.Schema({
apiTests: [apiTestArray],
completed: { type: Boolean, require: true, default: false }
});
有效的代码
const findOneAndUpdate = await ApiTest.findOneAndUpdate(
{ _id: inProgressTest._id },
{
$set: { completed: true }
},
{ new: true }
);
apiTestSchema.post("findOneAndUpdate", async function(doc, next) {
console.log("post hook ran");
// console.log("this", this);
console.log("apiTest", doc);
doc.completed = doc.apiTests.some(apiTest => apiTest.completed);
// doc.save().then(next());
});
无效的所需代码
const findOneAndUpdate = await ApiTest.findOneAndUpdate(
{ _id: inProgressTest._id, "apiTests.$.apiName": scoutVersion },
{
$set: {
"apiTests.$.completed": true,
"apiTests.$.endingStats": newStats,
"apiTests.$.endTime": endTime
}
},
{ new: true }
);
apiTestSchema.post("findOneAndUpdate", async function(doc, next) {
doc.completed = doc.apiTests.some(apiTest => apiTest.completed);
// doc.save().then(next());
});