Node.js Mongoose:TypeError:doc.validate不是函数 脚本
我有一个mongoose模型模式,如下所示:Node.js Mongoose:TypeError:doc.validate不是函数 脚本,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个mongoose模型模式,如下所示: var TerminalBalanceSchema = new mongoose.Schema({ currentBalances: [{ terminalID: { type: String, // required: '{path} is required' }, balance: { terminal: {
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
中执行替换对象的操作,并最终保存同一文档时,就会出现以下错误:
请注意,要替换对象,我将在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 { ...
for(变量i=0;i
猫鼬版本:4.4.19
这不是问题的实际答案,而是实现你所尝试的目标的提示 使用
$elemMatch
和currentBalances.$
作为匹配元素的参考,有一种更简单的方法来更新数组中的对象,我希望这就是您正在尝试做的
TerminalBalance.update({
$and: [
{_id: balanceID},
{currentBalances:{
$elemMatch:{ terminalID: response.data.terminalID }
}}
]
},{
$set: 'currentBalances.$': balance}
},
function(err, count) { ... });
我没有尝试过这段代码,因此可能会有一些输入错误。通过在数组上使用(内置JS的包装器)而不是直接在索引处为
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;
...
。。。
if(terminalBalance.currentBalances[i].terminalID==response.data.terminalID){
terminalBalance.currentBalances[i].splice(i,1,balance);//这实际上不是Array.prototype.splice()
,而是为文档添加了跟踪功能。这有助于解释为什么使用splice()
可以解决您的问题。感谢您指出@c1more,我将更正我的答案。
...
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;
...