无法从节点api更新嵌套对象属性的mongodb文档。

问题描述 投票:0回答:1

我有以下的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. 我使用一个put请求来实现这个目的。

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

我到底做错了什么? 下面是我的ReviewSchema,以了解更多的情况。

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;
node.js mongodb nested mongoose-schema put
1个回答
1
投票

在Mongoose中,你不需要指定 "无名氏 "和 "姓名"。$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);
    }
  }
);
© www.soinside.com 2019 - 2024. All rights reserved.