2015-03-13 57 views
0

嗨,我在猫鼬新和我有填入收集问题它不返回任何数据,我不知道为什么这里是我的代码:Mongoosejs:填充不返回任何数据

公司型号

'use strict'; 

/** 
* Module dependencies. 
*/ 
var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    Agent = mongoose.model('Agent'), 
    DBRef = mongoose.SchemaTypes.DBRef; 

/** 
* Company Schema 
*/ 
var CompanySchema = new Schema({ 
name: { 
    type: String, 
    default: '', 
    //required: 'Please fill Company name', 
    trim: true 
}, 
created: { 
    type: Date, 
    default: Date.now 
}, 
updated: { 
    type: Date, 
    default: Date.now 
}, 
address: { 
    type: String, 
    default: '', 
    //required: 'Please fill Company address', 
    trim: true 
}, 
locked: { 
    type: Boolean, 
    default: true, 
}, 
deleted: { 
    type: Boolean, 
    default: false, 
}, 
logo: { 
    type: String, 
    default: '', 
}, 
email: { 
    type: String, 
    default: '', 
    index: { unique: true } 
    //required: 'Please fill Company email', 
}, 
tel: { 
    type: String, 
    default: '', 
    //required: 'Please fill Company tel', 
}, 
fax: { 
    type: String, 
    default: '', 
    //required: 'Please fill Company fax', 
}, 
type: { 
    type: String, 
    //required: 'Please fill Company type', 
    trim: true 
}, 
description: { 
    type: String, 
    default: '', 
    trim: true 
}, 
validator: { 
    type: Schema.ObjectId, 
    ref: 'User' 
}, 
admins: [Agent] 
}); 

module.exports = mongoose.model('Company', CompanySchema); 

代理模式

'use strict'; 

/** 
* Module dependencies. 
*/ 
var mongoose = require('mongoose'), 
Schema = mongoose.Schema, 
//Company = mongoose.model('Company'), 
DBRef = mongoose.SchemaTypes.DBRef; 

/** 
* Agent Schema 
*/ 
var AgentSchema = new Schema({ 
// Agent model fields 
// ... 
firstname: { 
    type: String, 
    default: '' 
}, 
lastname: { 
    type: String, 
    default: '' 
}, 
email: { 
    type: String, 
    default: '', 
    index: { unique: true } 
}, 
password: { 
    type: String, 
    default: '' 
}, 
roles: { 
    type: Array, 
}, 
created: { 
    type: Date, 
    default: Date.now 
}, 
updated: { 
    type: Date, 
    default: Date.now 
}, 
deleted: { 
    type: Boolean, 
    default: false 
}, 
locked: { 
    type: Boolean, 
    default: false 
}, 
workFor: { 
    type: Schema.ObjectId, 
    ref: 'Company' 
} 
}); 

module.exports = mongoose.model('Agent', AgentSchema); 

填充代码

Company.findById(id).populate('admins').exec(function(err, company) { 
    if (err) return next(err); 
    if (!company) return next(new Error('Failed to load Company ' + id)); 
    console.log(company.admins); 
    req.company = company ; 
    next(); 
}); 

谢谢:)。

回答

0

您的公司架构定义实际上定义了代理嵌入到公司文档中,而不是引用。如果你想,你可以再填入你应该使用这样的引用:

var CompanySchema = new Schema({ 
.... 
admins: [{type: Schema.Types.ObjectId, ref: 'Agent'}], 
.... 
+0

我这样做,但它并没有给任何reslut – fynx 2015-03-14 13:22:59

+0

好吧,您的Schema和您的查询看起来是正确的(如果您在上面的答案中提出了更正建议)。也许在你的数据库中,company.admins集合中没有包含管理对象的公司对象?你有没有检查你的数据库的内容beore这个查询?或向我们显示保存公司对象和引用的管理对象的代码。 – Reto 2015-03-14 15:50:28

+0

thnks,这里是我的代码 – fynx 2015-03-15 13:52:28

0

thnks雷托,这里是公司的节能代码:

/** 
* Create a Company 
*/ 
exports.create = function(req, res) { 
    var company = new Company(req.body); 
    User.findById('54e22d19aae0cff01a47df96',function(err,user){ 
     if (err) { 
      return res.status(400).send({ 
       messages: errorHandler.getErrorMessage(err) 
      }); 
     } 


     company.user = user; 
     req.checkBody('name', 'please fill the name').notEmpty(); 
     req.checkBody('address', 'please fill the address').notEmpty(); 
     req.checkBody('tel', 'please fill a correct phone').notEmpty().isNumeric(); 
     req.checkBody('type', 'please fill the type').notEmpty(); 
     req.checkBody('email', 'please fill a correct email').isEmail(); 
     req.checkBody('admin.firstname', 'please fill the admin firstname').notEmpty(); 
     req.checkBody('admin.lastname', 'please fill the admin lastname').notEmpty(); 
     req.checkBody('admin.email', 'please fill a correct admin email').isEmail(); 
     req.checkBody('admin.password', 'please fill the admin password').notEmpty(); 

     var errors = req.validationErrors(); 

     if (errors) { 
      return res.status(400).send({ 
        messages: errors 
       }); 
     }else{ 


      company.save(function(err) { 
       if (err) { 
        return res.status(400).send({ 
         messages: errorHandler.getErrorMessage(err) 
        }); 
       } else { 
        var agents = preapareAgents(req,company); 
        Agent.create(agents,function(err){ 
         if(err){ 
          return res.status(400).send({ 
           messages: errorHandler.getErrorMessage(err) 
          }); 
         }else{ 
          res.jsonp({company: company, agents: agents}); 
         } 
       }); 

       } 
      }); 

     } 
    }); 


}; 
+0

您正在混合两个不同的概念1.子文档,其中管理员是公司模式的一部分(并在每个公司中冗余保存)和2.参考,管理员保存在不同的集合中并且只保存公司对象中的引用。只有在第二种情况下,您需要填充。你的初始模式和你的保存代码假定概念1,你的查询代码填充假设概念2.两者都很好,你只需要决定使用哪一个。 – Reto 2015-03-15 20:18:18

+0

其实,我再次查看了你的代码。我不确定你的意图,你的保存代码假设每个公司有1个代理,但你的模式有一个数组。这次通话应该保存一家新公司和一个新代理吗?如果您只想在公司架构中引用,则需要先保存代理,然后在保存公司之前用包含已保存代理的_id的数组替换company.agents属性 – Reto 2015-03-15 20:23:17

+0

这是我的模型:一家公司有多个代理商,代理商是一家公司,我可以用猫鼬代表这个。 注:我想将管理员存储在不同的架构中。 – fynx 2015-03-15 22:23:37