Mongoose:TypeError:doc.validate不是函数

时间:2016-06-02 06:43:16

标签: node.js mongodb mongoose

方案

我有一个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

2 个答案:

答案 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;
...