(节点:17348)UnhandledPromiseRejectionWarning:MongoError:对路径“_id”执行更新将修改不可变字段“_id”

Posted

技术标签:

【中文标题】(节点:17348)UnhandledPromiseRejectionWarning:MongoError:对路径“_id”执行更新将修改不可变字段“_id”【英文标题】:(node:17348) UnhandledPromiseRejectionWarning: MongoError: Performing an update on the path '_id' would modify the immutable field '_id' 【发布时间】:2021-08-12 15:20:07 【问题描述】:

尝试更新时出现此错误....mongoose 在使用以下代码时抛出此错误....尝试使用 const project = ... 而不是 new Product(...)但没有运气。

router.put("/:id", multer(storage: storage).single("image") , (req, res, next) => 
    let imagePath = req.body.imagePath;
    if (req.file) 
        const url = req.protocol + "://" + req.get("host");
        imagePath = url + "/images/" + req.file.filename
    
    const product = new Product(
        
            _id: req.body.id,
            title: req.body.title,
            cost: req.body.cost,
            description: req.body.description,
            imagePath: imagePath
    
        
    ) ;
    console.log(product)
    Product.updateOne(_id: req.params.id, product)
    .then(result => 
        console.log(result);
        res.status(200).json( message: "Update Successful !!");
    );
);

【问题讨论】:

您的问题找到解决方案了吗? 【参考方案1】:

您需要从用于更新文档的对象中删除键 _id

const product = new Product(
    
        title: req.body.title,
        cost: req.body.cost,
        description: req.body.description,
        imagePath: imagePath
    
) ;

这将解决您的问题。

问题是,在更新 _id 与您在代码中传递的文档匹配的文档时,

    Product.updateOne(_id: req.params.id, product)

您也在尝试更新_id 字段的值。 _id 默认是不可变的,这意味着它不能被更新,因为它代表了文档的唯一性。

编辑:如果您还需要更新文档的_id,那么您可以从此处获取参考来执行此操作。虽然_id 不能直接更新,但是有一个解决方法。

How to update the _id of one MongoDB Document?

【讨论】:

以上是关于(节点:17348)UnhandledPromiseRejectionWarning:MongoError:对路径“_id”执行更新将修改不可变字段“_id”的主要内容,如果未能解决你的问题,请参考以下文章

让memcached和mysql更好的工作

poj2752 Seek the Name, Seek the Fame

将 NodeJS Docker 容器连接到 MySQL Docker 容器 - docker-compose 3

Delphi TreeView 选择父节点,选择所有子节点

js DOM知识总结

给出一个二叉树的节点,返回该节点的前驱节点