我正在尝试从特定猫鼬文档中的数组更新所有对象,主要问题是我的原始更新查询复制了数组中的对象。因此,我决定最好的措施是使用它们的ObjectId来更新它们,将我的问题数组的更新查询嵌套在指定文档的更新查询中。
const pollSchema = mongoose.Schema({
title: { type: String },
description: { type: String },
questions: [{
question: {
type: String
},
answerType: {
type: Number
},
answer: {
type: String
}
}],
usrInsert: { type: mongoose.Schema.Types.ObjectId, ref: 'AdminUsr' },
usrUpdate: { type: mongoose.Schema.Types.ObjectId, ref: 'AdminUsr' }
});
router.put("/edit/:id", (req, res, next) => {
const poll = {
title: req.body.title,
description: req.body.description,
questions: req.body.questions
};
Poll.findOneAndUpdate({ _id: req.params.id }, poll).then(result => {
res.status(200).json({ message: "Update succesful" });
})
.catch(error => {
console.log(error);
res.status(500).json({
message: "Couldn't update poll!"
});
});
});
此查询引起了将相同数据保存为新对象而不是更新该位置中的旧对象的问题。主要是因为我没有给它一个特定的问题。_id,但是该选项只会更新第一个,并且如果我保存了多个对象,该选项将不起作用。
我浏览了以下线程,其中大多数试图将其应用于我的查询中,但是无法将这些解决方案应用于我的查询中。
Mongoose, update values in array of objects, How can i update all object in an array without id at MongoDB, Mongoose findOneAndUpdate — updating an object inside an array of objects
首先将我的查询更改为以下内容:
router.put("/edit/:id", (req, res, next) => {
const poll = {
title: req.body.title,
description: req.body.description,
questions: req.body.questions
};
Poll.findOneAndUpdate({ _id: req.params.id, 'questions._id':
poll.questions._id }, {
'$set': {
'questions.$.question': poll.questions.question,
'questions.$.answerType': poll.questions.answerType,
'questions.$.answer': poll.questions.answer
}
}, poll).then(result => {
res.status(200).json({ message: "Update succesful" });
})
.catch(error => {
console.log(error);
res.status(500).json({
message: "Couldn't update poll!"
});
});
});
经过研究,我发现尝试使用$ set更新整个数组时遇到了错误,因为我只给了它一个ID以查找和更新特定对象。
过去查询的问题是,第一个查询复制了我的对象,将它们另存为新对象,而不是进行更新。
第二个查询确实收到了问题,但没有插入数据库。因此,与其正确地更新“您几岁?变成“你是哪年出生的?”仍然是“你几岁?”
我希望我对自己尝试过的东西和期望值已经很清楚了,如果我本来就在正确的道路上,那么我会尽可能多地介绍尝试过的选项。
谢谢!