无法使用来自节点 api 的嵌套对象 属性 更新 mongodb 文档

Unable to update mongodb document with nested object property from node api

我有以下 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。我正在使用放置请求来完成此操作:

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);
            }
        } )
    });
}

为了对此进行测试,我使用以下请求正文通过 Postman 执行此 PUT 请求:

{
    "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,
    }
}

我做错了什么?这是我的 reviewsSchema 以获取更多上下文:

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;

在 Mongoose 中,您不需要指定 $set。此外,根据您从邮递员发送的示例 JSON 而不是 req.body.is_scheduled,您需要在查询中提供 req.body.three_month_review_status.is_scheduled。此外,如果您想要 findOneAndUpdate 到 return 更新的文档

,则需要添加 {new: true}

因此您可以像

一样更新查询
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);
    }
  }
);