2016-11-15 14 views
1

我基本上相信这个错误是由于我打电话的对象不包含.populate函数,尽管我不知道如何改变它的工作。TypeError:populate(...)。exec不是函数

首先,这里是完整的错误。

TypeError: exam[0].modules[u].topics[i].populate(...).exec is not a function 
    at /home/ubuntu/workspace/tests/app.js:425:84 
    at Query.Model.$wrapCallback (/home/ubuntu/workspace/tests/node_modules/mongoose/lib/model.js:3336:16) 
    at /home/ubuntu/workspace/tests/node_modules/mongoose/node_modules/kareem/index.js:259:21 
    at /home/ubuntu/workspace/tests/node_modules/mongoose/node_modules/kareem/index.js:127:16 
    at nextTickCallbackWith0Args (node.js:420:9) 
    at process._tickCallback (node.js:349:13) 


Process exited with code: 1 

我指的是具体线路是exam[0].modules[u].topics[i].populate("questions").exec(function(err,quests)另一条线,我相信是显著这里重要的是,它返回exam不包含.populate功能行examBoard.find({name:req.body.examBoardName},function(err,exam)

我认为这很大程度上取决于我缺乏经验,而不是逻辑错误,但我不确定。

以下是包含错误的代码部分。

app.post("/test",function(req,res) 
{ 
    console.log("\n\n\n\n") 
    var time = req.body.time; 
    var topicName = [req.body.topic1,req.body.topic2,req.body.topic3,req.body.topic4,req.body.topic5]; 
    var topicsArray = []; 
    examBoard.find({name:req.body.examBoardName},function(err,exam) 
    { 
     if(err) 
     { 
      console.log(err); 
     } 
     else 
     { 
      for(var u=0;u<exam[0].modules.length;u++) 
      { 
       console.log("exam[0].modules[u]:\n"+exam[0].modules[u]); 
       console.log("req.body.moduleName:\n"+req.body.moduleName); 
       if(exam[0].modules[u].name==req.body.moduleName) 
       { 
        console.log("topicName[]:\n"+topicName[0]+"\n"+topicName[1]+"\n"+topicName[2]+"\n"+topicName[3]+"\n"+topicName[4]); 
        for(var i=0;i<exam[0].modules[u].topics.length;i++) 
        { 
         console.log("exam[0].modules[u].topics[i].name:\n"+exam[0].modules[u].topics[i].name); 
         for(var t=0;t<topicName.length;t++) 
         { 
          if(exam[0].modules[u].topics[i].name==topicName[t]) 
          { 
           // exam[0].modules[u].topics[i].find({name:topicName[t]}).populate("questions").exec(function(err,quests) 
           exam[0].modules[u].topics[i].populate("questions").exec(function(err,quests) 
           { 
            if(err) 
            { 
             console.log(err); 
            } 
            else 
            { 
             console.log("exam[0].modules[u].topics[i].questions:\n"+exam[0].modules[u].topics[i].questions); 
             topicsArray.push({ 
              name:topicName[i], 
              questions:quests 
             }); 
            } 
           });  
          } 
         } 
        } 
        break; 
       } 
      } 
     } 
    }); 
}); 

这里是examBoard模式。

var mongoose = require("mongoose"); 

var topicSchema = new mongoose.Schema({ 
    name: String, 
    questions:[ 
     { 
      type:mongoose.Schema.Types.ObjectId, 
      ref:"question" 
     } 
    ], 
}); 

var moduleSchema = new mongoose.Schema({ 
    name: String, 
    topics: [topicSchema] 
}); 

var examBoardSchema = new mongoose.Schema({ 
    name: String, 
    modules: [moduleSchema] 
}); 

module.exports = mongoose.model("examBoard", examBoardSchema); 

而这里只是为了防止这里可能出现问题,导入模式。

var express     = require("express"), 
    mongoose    = require("mongoose"), 
    passport    = require("passport"), 
    bodyParser    = require("body-parser"), 
    LocalStrategy   = require("passport-local"), 
    passportLocalMongoose = require("passport-local-mongoose"), 

    seedDB     = require("./seeds"), 
    question    = require("./models/question"), 
    examBoard    = require("./models/examBoard"), 
    user     = require("./models/user"); 

回答

0

要调用从exam[0].modules[u].topics[i]populate方法,但实际上模型对象持此方法是exam[0],所以你可以在一个很深的对象的层次结构像这样填入您的考题:

exam[0].populate("modules.topics.questions") 

但等待一秒,现在模型将填写所有主题中的问题所有模块考试。从docs

var options = { 
    path: 'modules.topics.questions', 
    match: { 'modules.name': req.body.moduleName } 
}; 

exam[0].populate(options) 

利尔更多populate参数:

在你的情况,你通过MODULENAME先过滤,这样你就可以配置populate选项,所以是这样。

+0

它肯定会在所有模块中的所有主题中填充所有问题,尽管在数据库增长时它的效率会非常低。 我想你提到了这一点,但是当你说把它从for循环中移出来时,我不确定这将如何阻止它填充所有内容,你能举个例子吗? –

+0

@ JonathanWoollett-light检查我的回答,上面用你的用例编辑。 –

+0

Thnak你,这是我认为我只需要学习存在的东西。 –