如何更新猫鼬文档中的数组中的所有对象?

时间:2019-03-28 01:46:23

标签: arrays node.js mongodb mongoose

我正在尝试从特定猫鼬文档中的数组更新所有对象,主要问题是我的原始更新查询复制了数组中的对象。因此,我决定最好的措施是使用它们的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 objectsHow can i update all object in an array without id at MongoDBMongoose 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以查找和更新特定对象。

我期望但没有应用过去的查询

过去查询的问题是,第一个查询复制了我的对象,将它们另存为新对象,而不是进行更新。

第二个查询确实收到了问题,但没有插入数据库。因此,与其正确地更新“您几岁?变成“你是哪年出生的?”仍然是“你几岁?”

我希望我对自己尝试过的东西和期望值已经很清楚了,如果我本来就在正确的道路上,那么我会尽可能多地介绍尝试过的选项。

谢谢!

0 个答案:

没有答案