猫鼬findOneAndUpdate不是在更新文档,而是在创建一个新文档?

时间:2019-05-19 08:37:00

标签: javascript node.js mongodb express mongoose

我在后端使用Node,Express和MongoDB / Mongoose。我已设置以下PUT路线:

//where id is the unique id of the review, not the movie
router.put('/update/:id', [jsonParser, jwtAuth], (req, res) => {
    Review.findOneAndUpdate(req.params.id,
        { $set: { ...req.body } }, { new: true })
        .then(review => {
            console.log(review);
            res.status(203).json(review);
        })
        .catch(err => res.status(500).json({message: err}));
});

在我的POST路线上创建新文档时使用邮递员,响应如下:

{
    "genre_ids": [
        "28"
    ],
    "_id": "5ce112d0aeadc44ea0ea7bb0",
    "movieId": 447404,
    "title": "Pokemon Detective Pikachu",
    "poster_path": "/wgQ7APnFpf1TuviKHXeEe3KnsTV.jpg",
    "reviewer": "5cda5d08f3a74252c83b4a63",
    "reviewTitle": "the best",
    "reviewText": "new review",
    "reviewScore": 5,
    "__v": 0
}

当我尝试在此URL上更新以下文档时使用邮递员 .../review/update/5ce112d0aeadc44ea0ea7bb0,其中id是从上方POST响应的_id中获取的。 我在PUT请求中做了一个非常简单的更改,只是为了更改分数。

{
    "reviewScore": 1
}

然后我从PUT路由中收到以下响应。

{
    "genre_ids": [
        "28"
    ],
    "_id": "5ce089116b537a08403ed25f",
    "movieId": 447404,
    "title": "Pokemon Detective Pikachu",
    "poster_path": "/wgQ7APnFpf1TuviKHXeEe3KnsTV.jpg",
    "reviewer": "5ce0882d90b63613700b066a",
    "reviewTitle": "the best",
    "reviewText": "updated review",
    "reviewScore": 1,
    "__v": 0
}

您可以看到,在PUT请求响应中,_idreviewer均已更改。实际上,它已经为另一个用户创建了一个新文档,而不是更新原始文档。如果我登录到_id响应提供的属于PUT的帐户,则确实显示该帐户已经创建了一个新文档,而没有更新其他/原始帐户的文档。< / p>

为什么会这样?请帮忙。

2 个答案:

答案 0 :(得分:0)

您需要将条件作为对象提供。

router.put('/update/:id', 
    [jsonParser, jwtAuth], 
    (req, res) =>{
         Review.findOneAndUpdate({'_id' :req.params.id}, { $set: { ...req.body } }, { new: true })
        .then(review => { console.log(review);
         res.status(203).json(review); 
        })
        .catch(err => res.status(500).json({message: err}));
    }
);

或者,如果您想像代码中一样直接使用id,只需将findOneAndUpdate替换为findByIdAndUpdate

签出Mongoose Query API

答案 1 :(得分:0)

您当前的查询条件是错误的。进行如下更改。

router.put('/update/:id', [jsonParser, jwtAuth], (req, res) => {
    Review.findOneAndUpdate({'_id' : req.params.id},
        { $set: { ...req.body } }, { new: true })
        .then(review => {
            console.log(review);
            res.status(203).json(review);
        })
        .catch(err => res.status(500).json({message: err}));
});
  1. https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/mongoose