我定义了以下模式:
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函数:(
答案 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]
}
并更正联系方式中的拼写错误。