我有一个mongoose模型架构,如下所示:
var TerminalBalanceSchema = new mongoose.Schema({
currentBalances: [{
terminalID: {
type: String,
// required: '{path} is required'
},
balance: {
terminal: {
type: Number,
required: '{path} is required'
},
calculated: {
type: Number,
required: '{path} is required'
}
},
lastInquiryDate: Date
}]
});
其中currentBalances
是一个对象数组。
基于上述模式的mongoose模型TerminalBalance
的集合始终包含 单个对象 ,其中只有currentBalances
数组中的项目可能变化
每当我执行 替换 文档的数组currentBalances
中的对象,并最终保存同一文档时,我会收到以下错误:
x:\node\mynps-tcp-server\node_modules\mongoose\lib\schema\documentarray.js:104 doc.validate({ __noPromise: true }, function(err) { ^ TypeError: doc.validate is not a function at x:\node\mynps-tcp-server\node_modules\mongoose\lib\schema\documentarray.js:104:11 at DocumentArray.SchemaType.doValidate (x:\node\mynps-tcp-server\node_modules\mongoose\lib\schematype.js:654:22) at DocumentArray.doValidate (x:\node\mynps-tcp-server\node_modules\mongoose\lib\schema\documentarray.js:77:35) at x:\node\mynps-tcp-server\node_modules\mongoose\lib\document.js:1171:9 at nextTickCallbackWith0Args (node.js:452:9) at process._tickCallback (node.js:381:13)
请注意,要替换一个对象,我会遍历currentBalances
数组,如果该对象与我正在寻找的对象相同,我会替换它:
for (var i = 0; i < terminalBalance.currentBalances.length; i++) {
if(terminalBalance.currentBalances[i].terminalID === response.data.terminalID){
terminalBalance.currentBalances[i] = balance;
terminalBalance.save(function (err) {
console.log('err', err); // this `err` is never thrown, that is the above error is thrown before reaching here
});
break;
} else { ...
猫鼬版本: 4.4.19
答案 0 :(得分:-1)
不是问题的实际答案,而是实现您正在尝试的内容的提示
使用<ul>
和$elemMatch
作为匹配元素的引用更新阵列中的对象的方法更简单,我希望这是您要做的事情
currentBalances.$
我还没有尝试过这段代码,所以期待一些拼写错误。
答案 1 :(得分:-1)
通过在数组上使用MongooseArray.splice(,它是内置JS Array.prototype.splice()
的包装器)解决了我的问题,而不是直接在索引处分配对象currentBalances
数组。
...
if(terminalBalance.currentBalances[i].terminalID === response.data.terminalID){
terminalBalance.currentBalances[i].splice(i, 1, balance); //<=== here
terminalBalance.save(function (err) {
console.log('err', err);
});
break;
...