Node.js Mongoose报告更新时没有错误,但不更新
在这里,我想用Mongoose更新mongodb文档,不报告任何错误,但实际上没有成功更新 我有这个模式: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
/**
* 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) {
// ...