Невозможно обновить документ mongodb со свойством вложенного объекта из узла api - PullRequest
0 голосов
/ 17 июня 2020

У меня есть следующий документ mongodb:

{
    "_id" : ObjectId("5ee95b41ca023a3deb252ef2"),
    "uid" : "jdoe",
    "name" : "John Doe",
    "employee_hire_date" : "2012-06-20",
    "three_month_review_target" : "2012-09-20",
    "six_month_review_target" : "2012-12-20",
    "three_month_review_status" : {
        "is_scheduled" : null,
        "is_team_member_emailed" : null,
        "is_review_executed" : null,
    },
    "six_month_review_status" : {
        "is_scheduled" : null,
        "is_team_member_emailed" : null,
        "is_review_executed" : null,
    }
}

Я хотел бы обновить вложенное свойство three_month_review_status.is_scheduled до true. Я использую запрос на размещение, чтобы выполнить sh это:

const mongoose = require('mongoose');
const Reviews = require('../modules/reviews/models/reviews');

module.exports = (app) => {
    app.put('/api/reviews/isScheduled', async (req, res) => {
        console.log('body', req.body)
        console.log('uid', req.body.uid)
        console.log('is_scheduled', req.body.three_month_review_status.is_scheduled)
        Reviews.findOneAndUpdate( { 'uid': req.body.uid }, { $set: { 'three_month_review_status.is_scheduled': req.body.is_scheduled }}, (err, result) => {
            if (err) {
                console.log('error', err)
            }
             else {
                console.log('updated', result);
                res.status(200).send(result);
            }
        } )
    });
}

Чтобы проверить это, я выполняю этот запрос PUT через Postman со следующим телом запроса:

{
    "uid": "jdoe",
    "three_month_review_status": {
        "is_scheduled": "true"
    }
}

Однако, когда запрос выполняется, два других вложенных объекта удаляются, а is_scheduled остается нулевым. Это документ после выполнения запроса:

{
    "_id" : ObjectId("5ee95b41ca023a3deb252ef2"),
    "uid" : "jdoe",
    "name" : "John Doe",
    "employee_hire_date" : "2012-06-20",
    "three_month_review_target" : "2012-09-20",
    "six_month_review_target" : "2012-12-20",
    "three_month_review_status" : {
        "is_scheduled" : null
    },
    "six_month_review_status" : {
        "is_scheduled" : null,
        "is_team_member_emailed" : null,
        "is_review_executed" : null,
    }
}

Что я делаю не так? Вот моя схема обзоров для большего контекста:

const { Schema, model } = require('mongoose');

const reviewsSchema = new Schema({
    uid: String,
    name: String,
    employee_hire_date: String,
    three_month_review_target: String,
    six_month_review_target: String,
    three_month_review_status: {
        is_scheduled: Boolean,
        is_team_member_emailed: Boolean,
        is_review_executed: Boolean,
    },
    six_month_review_status: {
        is_scheduled: Boolean,
        is_team_member_emailed: Boolean,
        is_review_executed: Boolean,
    },
})

const Reviews = model('review', reviewsSchema);

module.exports = Reviews;

1 Ответ

1 голос
/ 17 июня 2020

В пн goose $set указывать не нужно. Также на основе образца JSON, который вы отправляете от почтальона вместо req.body.is_scheduled, вам необходимо указать req.body.three_month_review_status.is_scheduled в запросе. Кроме того, необходимо добавить {new: true}, если вы хотите, чтобы findOneAndUpdate возвращал обновленный документ

Таким образом, вы можете обновить запрос, например

Reviews.findOneAndUpdate(
  { uid: req.body.uid },
  {
    "three_month_review_status.is_scheduled":
      req.body.three_month_review_status.is_scheduled,
  },
  { new: true },
  (err, result) => {
    if (err) {
      console.log("error", err);
    } else {
      console.log("updated", result);
      res.status(200).send(result);
    }
  }
);
...