Mongoose findOneAndUpdate не обновляет документ, а создает новый? - PullRequest
0 голосов
/ 19 мая 2019

Я использую 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}));
});

Используя Postman при создании нового документа на моем маршруте 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
}

Использование Postmanкогда я пытаюсь обновить следующий документ по этому URL .../review/update/5ce112d0aeadc44ea0ea7bb0, где идентификатор взят из _id ответа POST выше.Я внес очень простое изменение в запрос 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 изменились и _id, и reviewer.Фактически он создал новый документ для другого пользователя вместо обновления исходного документа.Если я войду в учетную запись, принадлежащую _id, которая указана в ответе PUT, это действительно показывает, что для этой учетной записи создан новый документ, а не обновлен документ для другой / исходной учетной записи.

Почему это происходит?Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Ваше текущее условие запроса неверно. Измените его следующим образом.

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
0 голосов
/ 19 мая 2019

Вы должны предоставить условия как объект.

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.

Оформить API Mongoose Query

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...