【问题标题】:Why doesn't findByIdAndUpdate update the document?为什么 findByIdAndUpdate 不更新文档?
【发布时间】:2020-05-07 03:42:30
【问题描述】:

我对以下功能有疑问

export function updateLine(req: Request, res: Response) {
    if (!req.params.id || !req.body) return res.status(400).send({ message: 'Client has not sent params' });
    Line.findByIdAndUpdate(req.params.id, req.body, async (err, lineUpdated) => {
        console.log("req.params.id", req.params.id)
        console.log("lineUpdated", lineUpdated)
        console.log("req.body", req.body)
        if (err) return res.status(409).send({ message: 'Internal error, probably error with params' });
        if (!lineUpdated) return res.status(404).send({ message: 'Document not found' });
        if (req.params.id !== lineUpdated.id) await Key.updateMany({ 'line': req.params.id }, { 'line': lineUpdated._id }).exec(err => {
            if (err) return res.status(500).send({ message: 'Key Internal Server Error' });
        });
        return res.status(200).send({ data: lineUpdated });
    });
}

我想做的只是用包含req.body的内容更新文档req.params.id

console.log()显示的响应如下

req.params.id ACCSEH
lineUpdated {
  _id: 'ACCSEH',
  name: 'Accesorios (SEH)',
  started: 2020-04-21T20:25:10.395Z,
  __v: 0
}
req.body { id: 'ACCSEJ', name: 'Accesorios (SEH)' }

我做错了什么?

我已经知道 lineUpdated 会在更改之前将函数返回给我。我的意思是当我进行查询以查看更改时,什么都没有改变

enter image description here

【问题讨论】:

  • 您要更新_id 吗?
  • @TheeSritabtim 是的
  • 1.正文指定了id,但您不想更新_id。 2.即使正文正确,您也无法更新_id,如答案中所述,因为它用作主键并且是不可变的
  • 嗯好的顺便说一句。例如,如果我将 _id 更改为 idk 标识符,我该如何参考。如何引用用户架构中的标识符部分@TheeSritabtim
  • 对不起,我不太明白你的意思。你能举一个更具体的例子吗?

标签: javascript mongodb typescript mongoose


【解决方案1】:

参考documentation

字段名_id保留作为主键使用;它的价值 在集合中必须是唯一的,是不可变的,并且可以是任何类型 不是一个数组。

_id 字段一旦插入到集合中,就无法更改

【讨论】:

    【解决方案2】:

    当通过 ID 查找和更新时,您不能在对象中给它一个 ID - 您需要给它一个包含其他项目(名称、开始、_v)的某种组合的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2014-02-13
      • 2013-08-14
      • 2018-08-18
      • 1970-01-01
      • 2017-02-10
      • 2021-08-26
      相关资源
      最近更新 更多