javascript - 在另一个模型中引用/填充 Mongoose 模型时出现问题

标签 javascript node.js mongoose mongoose-populate mongoose-schema

背景:允许用户发布投票的应用程序。
我在用户模型中填充对民意调查模型的引用时遇到了一些麻烦。我正在使用 mongoose.populate 尝试填充民意调查。在我的 route ,填充函数无法正常工作(返回的用户为空)。这是我的模型...

用户.js:

// models/users.js

var mongoose = require('mongoose'),
    Poll = require('./poll');

//define the schema for our user model
var userSchema = mongoose.Schema({
    local:{
        email: String,
        password: String,
        name: String
    },
    twitter:{
        id: String,
        token: String,
        name: String
    },
    polls:[{type: mongoose.Schema.Types.ObjectId, ref:'Poll'}]
});

poll.js:

//load mongoose
var mongoose = require('mongoose'),
    User = require('./user');


var pollSchema = mongoose.Schema({
       name:String,
       options:[String],
       creator: {type:mongoose.Schema.Types.ObjectId, ref:'User'}
});


module.exports = mongoose.model('Poll', pollSchema);

这是我要在...中实现人口的路线

 //require user and poll model 
 var User = require('../models/user'),
 Poll = require('../models/poll');

 app.post('/dashboard', isLoggedIn, function(req,res){ 

    var poll = {name: req.body.name, 
                options: req.body.option, 
                creator: req.user.local.id};

    //create new poll 
    var newPoll = new Poll();
    newPoll.polls = poll;

    //find the user with the request id and populate polls reference in User (UserSchema)
    User.findById(req.user.local.id)
         .populate('polls')
          .exec(function(err,user){ // cant figure this out...

              if(err){return err;}

              console.log(user); // yields null

              res.send({success:true, message: "Post Successful!"});

           });        
     });

任何帮助、建议、想法将不胜感激。谢谢。

最佳答案

Mongoose 的种群是一个很棒的功能。从我在您的代码中看到的,您似乎没有将池分配给用户。您有引用用户内部池的第一部分,但没有引用池内部用户的第二部分, Mongoose 需要两者来执行操作。

我认为您希望池有一个名称和选项列表。我在您的代码中看到的是一个包含池数组的池,因此我更改了池架构以适应您的解释。

尝试使用此新池架构在池中添加对用户的引用:

pool.js

var mongoose = require('mongoose');

var pollSchema = mongoose.Schema({
       name:String,
       options:[String],
       creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
});


module.exports = mongoose.model('Poll', pollSchema);

现在,保存池时,不要忘记添加您的用户引用。您正在为用户填充池,因此 Mongoose 回调中传递的对象将不是池列表,而是您要查找的用户。多亏了population,您将在属性pools中获得对象列表,而不是ID列表。

 var User = require('../models/user'),
 Poll = require('../models/poll');

 app.post('/dashboard', isLoggedIn, function(req,res){ 

    var poll = {
       name: req.body.name, 
       options: req.body.option, 
       creator: req.user.local.id
     };

    var newPoll = new Poll();
    newPoll.polls = poll;

    User.findById(req.user.local.id)
         .populate('polls')
          .exec(function(err, user){
           /*
             You should get in user object something like:
             {
               local: {...},
               twitter: {...},
               pools: [{
                 name: 'Pool1',
                 options: [...]
               }]
              }
           */
           });        
     });
});

关于javascript - 在另一个模型中引用/填充 Mongoose 模型时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644018/

相关文章:

javascript - 添加vue组件动态

javascript - 趋势线 AmCharts 无法在没有日期的情况下工作

javascript - Aerospike 使用 JavaScript 连接

javascript - 无法在生产模式下升起 sails 。(sails lift --prod --verbose 不起作用)

node.js - restify.js + Passport.js 未验证 GET 请求

javascript - 单元测试错误 vue.js karma : undefined is not a constructor ()

javascript - 如何在javascript中向二维数组添加数据

node.js - 如何在 mongoose 中处理 mongoDB close

mongoose - 使用 SCRAM-SHA-1 在 Mongoose 中进行身份验证

node.js - MongoDB 架构 : default coordinates for GPS position