【问题标题】:How to Update Multiple Fields Inside an Array in Mongodb, Express, NodeJs?如何在 Mongodb、Express、NodeJs 中更新数组内的多个字段?
【发布时间】:2020-09-24 09:58:12
【问题描述】:

如何通过数组中的 ID 更新多个对象?我想通过用户的 ID 更新体验,

下面我附上了我的 mongodb json 对象截图:

我已经可以通过用户创建体验:

router.put('/experience',
    [
        auth,
        [
            check('title', 'Title is required').not().isEmpty(),
            check('company', 'Company is required').not().isEmpty(),
            check('from', 'From date is required').not().isEmpty(),
        ],
    ],
    async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }

        const {
            title,
            company,
            location,
            from,
            to,
            current,
            description,
        } = req.body;

        const newExp = {
            title,
            company,
            location,
            from,
            to,
            current,
            description,
        };

        try {
            const profile = await Profile.findOne({ user: req.user.id });
            // unshift is same with push it pushes it in the beginner rather than the end
            profile.experience.unshift(newExp);

            await profile.save();

            res.json(profile);
            console.log(req.body);
        } catch (err) {
            console.error(err.message);
            res.status(500).send('Send Error');
        }
    }
);

这是我关于更新的非工作代码strong text

router.patch('/experience/:exp_id', auth, async (req, res) => {
    let id = req.params.exp_id;
    let expId = req.body;
    try {
        const profile = await Profile.findOne({ user: req.user.id });

        profile.experience.findOneAndUpdate(
            { id },
            { $set: { expId } },
            { new: true }
        );
        res.json(profile);
    } catch (err) {
        console.error(err.message);
        res.status(500).send(err.message);
    }
});

【问题讨论】:

  • 在你的findOneAndUpdate函数中使用id而不是{id}并使用{ $set:{ 'expId': expId,,,,,,,more fields if needed} }而不是{ $set: { expId } }
  • 它返回 profile.experience.findOneAndUpdate 不是一个函数我的 profile.experience 是一个对象数组顺便说一句。 user: { // 特殊字段类型,因为 // 它将关联到不同的用户类型:mongoose.Schema.Types.ObjectId, ref: 'user', }, experience: [ { title: { type: String, required: true , }, company: { type: String, required: true, }, location: { type: String, }, from: { type: Date, required: true, },

标签: node.js mongodb express


【解决方案1】:

环顾四周,纠正以下内容:

  1. { id }{ "experience._id": id }
  2. { $set: { expId } }{ $set: { fields of experience } }
  3. 删除const profile = await Profile.findOne({ user: req.user.id });
  4. profile.experience.findOneAndUpdateProfile.findOneAndUpdate
  5. 添加数据和错误响应功能(err, data)
router.patch('/experience/:exp_id', auth, async (req, res) => {
    let id = req.params.exp_id;
    let expId = req.body;
    try {
        await Profile.findOneAndUpdate(
            { 
                "experience._id": id
            },
            { 
                $set: { 
                    'experience.$.title': req.body.title, 
                    'experience.$.company': req.body.company, 
                    'experience.$.from': req.body.from, 
                }
            },
            { new: true },
            (err, data) => {
                if (!err){
                    res.json(data);
                }else{
                    res.json(err);
                }
            }
        );
    } catch (err) {
        console.error(err.message);
        res.status(500).send(err.message);
    }
});

希望这会对你有所帮助。

【讨论】:

  • @turvishal 它只返回一个空经验数组。
  • 我试过这个代码:let id = req.params.exp_id; // 让 expId = req.body;尝试 { Profile.findOneAndUpdate( id, { $set: { 'experience.$.title': req.body.title, 'experience.$.company': req.body.company, 'experience.$.from': req .body.from, }, }, { new: true, useFindAndModify: false }, (err, data) => { if (!err) { res.json(data); } else { res.json(err); } } );
  • "operationTime": "6835510712953995265", "ok": 0, "errmsg": "位置运算符没有从查询中找到所需的匹配项。", "code": 2, "codeName ": "BadValue", "$clusterTime": { "clusterTime": "6835510712953995265", "签名": { "hash": "PlHS0lgvjRbEizQgDOhAGYEdyfo=", "keyId": "6829582588638658563" } }, "name": "MongoError "
  • @turvishal 成功了!非常感谢!
  • stackoverflow.com/q/62531870/11243223 在这里。提前致谢。
【解决方案2】:

https://stackoverflow.com/a/47762417/13199635这应该可以帮助你。同样在您当前的代码中,您正在更新您的profile.experience,您可能应该使用{_id: id} 而不仅仅是{id}。所以你更新的代码就像

profile.experience.findOneAndUpdate(
            { _id: id },
            { $set: { expId } },
            { new: true }
        );
        res.json(profile);

希望对你有帮助

【讨论】:

  • 应该是{_id: id} 而不是{id: id}
  • 是的。我以为他有自己定义的 id 字段。
  • 它返回 profile.experience.findOneAndUpdate 不是一个函数。我该如何解决这个问题?
  • @JmMacatangay,只需使用Profile.findOneAndUpdate
  • 它返回日期但不更新它。在我的 mongodb atlas 中,体验有它自己的 ID。我已经完成了删除,这是我的代码: router.delete('/experience/:exp_id', auth, async (req, res) => { try { const profile = await Profile.findOne({ user: req.user .id }); // 获取移除的索引 const removeIndex = profile.experience .map((item) => item.id) .indexOf(req.params.exp_id); profile.experience.splice(removeIndex, 1); await profile.save(); res.json(profile); } catch (err) { console.error(err.message); res.status(500).send('Send Error'); } });
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2017-12-29
  • 2018-12-29
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多