Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose:TypeError:doc.validate不是函数 脚本_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose:TypeError:doc.validate不是函数 脚本

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: {

我有一个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
中执行替换对象的操作,并最终保存同一文档时,就会出现以下错误:

请注意,要替换对象,我将在
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;
...