Node.js Mongoose报告更新时没有错误,但不更新

Node.js Mongoose报告更新时没有错误,但不更新,node.js,mongodb,mongoose,mongoose-schema,Node.js,Mongodb,Mongoose,Mongoose Schema,在这里,我想用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

在这里,我想用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,没有任何帮助

猫鼬版本4.13.20,猫鼬版本3.6.17

求救


Dor

我猜问题出在模式类型上?在Mongoose 4.x中,这些是唯一的:

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

因此,在您的情况下,下面的代码可能会解决此问题:

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

您是否检查了两个
console.log(分支)相同还是不同?可能也有相同的。你能把
numAffected
第三个参数打印到回调函数中,看看它是怎么说的吗?@SuleymanSah它们是不同的,正如你所看到的:)numAffected return 0@als我们在使用express时遇到了类似的问题,我们通过将回调语法转换为async/wait来修复它。这是Mongoose5.x的问题,所以我不确定这是否也能解决你的问题。或者,您可以根据请求准备一份更新文档,并使用一份
findbyidanddupdate
。这是正确的解决方案+解释。非常感谢你!
branch.markModified('stockCurrent');
branch.save(function (err, updated) {
// ...