【问题标题】:Mongoose reports no error on updating, but does not update猫鼬更新时没有报错,但是不更新
【发布时间】:2020-07-13 07:13:38
【问题描述】:

想着想用 Mongoose 更新 mongodb 文档,没有报告任何错误,但实际上没有成功更新。

我有这个架构:

/**
 * Branch Schema
 */
let BranchSchema = new Schema({
  name: String,
  domain: String,
  email: String,
  bm: { type: Schema.ObjectId, ref: 'User' },
  st: [{ type: Schema.ObjectId, ref: 'User' }],
  stockCurrent: {
    paper: Schema.Types.Object,
    ink: Schema.Types.Object
  },
  stockNeeded: {
    paper: Schema.Types.Object,
    ink: Schema.Types.Object
  },
}, { versionKey: false, usePushEach: true });

mongoose.model('Branch', BranchSchema);

尝试使用以下逻辑更新 stockCurrent:

        Branch.findById(config.branch.id, function (err, branch) {
            if (err) {
                res.status(422).send({
                    message: 'הסניף לא נמצא'
                });
            } else {
                console.log(branch);
                Object.keys(req.body.stock).forEach(function (type) {
                    Object.keys(req.body.stock[type]).forEach(function (code) {
                        if (req.body.stock[type][code] > 0) {
                            if (typeof branch.stockCurrent[type][code] === 'undefined') {
                                branch.stockCurrent[type][code] = 0;
                            }
                            branch.stockCurrent[type][code] += req.body.stock[type][code];
                        }
                    });
                });
                console.log(branch);

                branch.save(function (err, updated) {
                    console.log("err: " + err);
                    if (err) {
                        stock.remove();
                        res.status(422).send({
                            message: 'שגיאה בשמירת מלאי'
                        });
                    } else {
                        console.log(updated);
                        res.send({
                            message: 'מלאי נוסף בהצלחה'
                        });
                    }
                });
            }
        });

我进入成功部分,让我的控制台记录以下内容:

{
   "_id":5dd276a6bcc29a13789fcecb,
   "name":"בצלאל ארכיטקטורה",
   "domain":"bezalel.eazix.io",
   "email":"eazix.1.bezalel@gmail.com",
   "bm":5cdd2130d192ea03a87d2dfd,
   "stockNeeded":{
      "ink":{
         "GY":2,
         "PM":2,
         "M":2,
         "MBK":2,
         "PBK":2,
         "PC":2,
         "Y":2,
         "C":2,
         "waste":2
      },
      "paper":{
         "COATED":5,
         "PLAIN":5,
         "PHOTO":3
      }
   },
   "stockCurrent":{
      "paper":{
         "PLAIN":0
      },
      "ink":{
         "waste":0
      }
   },
   "st":[

   ]
}{
   "_id":5dd276a6bcc29a13789fcecb,
   "name":"בצלאל ארכיטקטורה",
   "domain":"bezalel.eazix.io",
   "email":"eazix.1.bezalel@gmail.com",
   "bm":5cdd2130d192ea03a87d2dfd,
   "stockNeeded":{
      "ink":{
         "GY":2,
         "PM":2,
         "M":2,
         "MBK":2,
         "PBK":2,
         "PC":2,
         "Y":2,
         "C":2,
         "waste":2
      },
      "paper":{
         "COATED":5,
         "PLAIN":5,
         "PHOTO":3
      }
   },
   "stockCurrent":{
      "paper":{
         "COATED":1,
         "PHOTO":2,
         "PLAIN":0
      },
      "ink":{
         "PM":1,
         "waste":0
      }
   },
   "st":[

   ]
}**"err":null**{
   "_id":5dd276a6bcc29a13789fcecb,
   "name":"בצלאל ארכיטקטורה",
   "domain":"bezalel.eazix.io",
   "email":"eazix.1.bezalel@gmail.com",
   "bm":5cdd2130d192ea03a87d2dfd,
   "stockNeeded":{
      "ink":{
         "GY":2,
         "PM":2,
         "M":2,
         "MBK":2,
         "PBK":2,
         "PC":2,
         "Y":2,
         "C":2,
         "waste":2
      },
      "paper":{
         "COATED":5,
         "PLAIN":5,
         "PHOTO":3
      }
   },
   "stockCurrent":{
      "paper":{
         "COATED":1,
         "PHOTO":2,
         "PLAIN":0
      },
      "ink":{
         "PM":1,
         "waste":0
      }
   },
   "st":[

   ]
}

我可以在这里看到初始状态、保存前的更新版本、err:null 和据称更新的文档。

但是,唉!该文件并没有真正更新。它保持不变。

我已经尝试了很多东西,搜索和寻找类似的案例,检查我的架构,将 useStrict:false 添加到架构中,没有任何帮助。

Mongoose 版本 4.13.20,Mongodb 版本 3.6.17

求救

多尔

【问题讨论】:

  • 你检查两个console.log(branch);是相同还是不同?也许有相同的。
  • 你能把numAffected第三个参数打印到回调函数中看看是什么意思吗?
  • @SuleymanSah 他们是不同的,你可以看到 :)
  • numAffected 返回 0 @als
  • 我们在使用 express 时遇到了类似的问题,我们通过将回调语法转换为 async/await 来修复它。这是 mongoose 5.x 虽然所以我不确定这是否也能解决你的问题。或者,您可以根据您的请求准备一份更新文档并使用findByIdAndUpdate

标签: node.js mongodb mongoose mongoose-schema


【解决方案1】:

我猜是 SchemaTypes 的问题?在 Mongoose 4.x 中,这些是唯一的 valid SchemaTypes

String
Number
Date
Buffer
Boolean
Mixed
Objectid
Array

注意Mixed 是一个选项,而不是Object。您需要告诉Mongoose,您使用model.markModified('pathName') 更新了Mixed 字段。见Mixed docs

所以在你的情况下,下面的代码可能会解决这个问题:

branch.markModified('stockCurrent');
branch.save(function (err, updated) {
// ...

【讨论】:

  • 这是正确的解决方案+解释。非常感谢!
猜你喜欢
  • 2015-07-13
  • 2012-03-28
  • 2016-05-24
  • 2018-10-28
  • 2017-04-29
  • 2013-01-14
  • 2021-12-31
  • 2020-11-13
相关资源
最近更新 更多