populate方法如何在mongoose中工作?

时间:2013-12-13 12:59:48

标签: node.js mongodb mongoose

我定义了以下模式:

module.exports.contact=Schema({

_id:Number,

name: String,

email: String,

contactNumber: String,

company:String,

_invoices:[{ type: Schema.Types.ObjectId, ref: 'invoice' }],


},{strict:false});


module.exports.invoice=Schema({

_contact: { type : Number, ref: 'contact'},

_id:Number,


invoiceNumber:Number,


},{strict:false});

以下数据插入mongodb:

    //CONTACT COLLECTION
    {_id:1,name:"Mrinal Purohit",email:"mrinal@mrinalpurohit.com",contactNumber:"+919016398554",company:""}
    //INVOICE COLLECTION
    { _id:1, invoiceNumber:3 , _contact:1 }

各自的藏品中只有一个文件。现在我尝试这个:

models.contact.find().populate('_invoices').exec(function(err,data){
        console.log(data);
        res.send(data)
    });

我得到以下内容:

[ { _id: 1,
    name: 'Mrinal Purohit',
    email: 'mrinal@mrinallabs.com',
    contactNumber: '+919016398554',
    company: '',
    __v: 0,
    _invoices: [] } ]

我实际上希望在数组中填充发票。架构定义有问题吗? 我无法完全理解mongoose的.populate函数:(

2 个答案:

答案 0 :(得分:0)

您的_id类型不匹配

在您的发票架构_id中定义为数字。但是,在您在联系方式中定义_invoices时,您已选择Schema.Types.ObjectId类型

尝试将_invoices的类型更改为数字,例如

module.exports.contact=Schema({
  _id:Number,
  name: String,
  email: String,
  contactNumber: String,
  company:String,
  _invoices:[{ type: Number, ref: 'invoice' }],
},{strict:false});

或者,您可以通过省略模式中的_id属性让Mongoose为您设置_id(这样您就可以保持_invoices不变)。它可以为您节省一些生成唯一ID的工作,它还有许多其他有用的属性(如嵌入式时间戳)

<强>更新

wethat指出另一个错误(我错过了)也是正确的。根据您要插入的数据,您尚未将新发票的_id推送到相关的联系文件中

以下是如何在正确更新相关联系人时创建发票的草图

Invoice.create(invoiceAttributes, function (err, invoice) {
    if (err) // Handle your error
    Contact.findOne({ _id: invoiceAttributes._contact}, function (err, contact) {
        if (err) // Handle your error
        contact._invoices.push(invoice._id); // The important step you were missing
        contact.save(); // Insert your callback
    });
});

答案 1 :(得分:0)

只需在联系人文档中添加1行_invoices: [1]

{
    _id: 1,
    name: "Mrinal Purohit",
    email: "mrinal@mrinalpurohit.com",
    contactNumber: "+919016398554",
    company: "",
    _invoices: [1]
}

并更正联系方式中的拼写错误。