Javascript mongoose.populate返回空数组
我目前正在使用mongoose v4.10.8,并试图在已定义的模型上填充多个数组 TransportModel.js 主席模型js TargetModel.js 在完成上述配置之后,我创建了一个椅子文档和一个目标文档 之后,我在一条路线上调用以下逻辑以获取一个运输凭证:Javascript mongoose.populate返回空数组,javascript,arrays,node.js,mongodb,mongoose,Javascript,Arrays,Node.js,Mongodb,Mongoose,我目前正在使用mongoose v4.10.8,并试图在已定义的模型上填充多个数组 TransportModel.js 主席模型js TargetModel.js 在完成上述配置之后,我创建了一个椅子文档和一个目标文档 之后,我在一条路线上调用以下逻辑以获取一个运输凭证: TransportModel.findOne({ tag: 'X' }) .populate("chairs") .populate("targets") .exec(funct
TransportModel.findOne({
tag: 'X'
})
.populate("chairs")
.populate("targets")
.exec(function(err, transport) {
if (err) {
console.error(err);
}
console.log('Transport: ', transport);
});
});
{
"_id": "xxxx9999xxxx9999xxxx9999",
"tag": "X",
"__v": 1,
"chairs": [],
"targets": []
}
以下是检索到的文档:
TransportModel.findOne({
tag: 'X'
})
.populate("chairs")
.populate("targets")
.exec(function(err, transport) {
if (err) {
console.error(err);
}
console.log('Transport: ', transport);
});
});
{
"_id": "xxxx9999xxxx9999xxxx9999",
"tag": "X",
"__v": 1,
"chairs": [],
"targets": []
}
因此,即使我查询了椅子和目标集合,并且我至少有一个文档,但运输文档不会被填充
此外,我还尝试了.populate的增强版本,但我一直得到空数组:
.populate({
path: "chairs",
model: "Chair"
})
.populate({
path: "targets",
model: "Target"
})
如果您已经将新椅子和目标推送到运输模型中,您可以使用mongoose deep populate模块更好地进行填充,下面是一个如何设置的简单示例
var mongoose = require('mongoose');
var deepPopulate = require('mongoose-deep-populate')(mongoose);
var Schema = mongoose.Schema;
var kindsSchema = new Schema({
name:{type:String,required:true,unique:true},
components:[{type:Schema.ObjectId,ref:'components'}],
associatedView:{type:String,default:'home/fragances'},
discount:{type:Number,default:0},
description:{type:String,default:'Nueva categoria'},
created_at:{type:Date,default:Date.now},
modified_at:{type:Date,required:true}
});
kindsSchema.plugin(deepPopulate,{
whitelist:[
'components.attributes',
]
populate:{
'components':{
select['attributes','discount']
}
}
});
您是如何将椅子和目标文档添加到TransportModel文档的?谢谢您的回复,@robertklep。这就是我试图实现的。填充,我希望运输文档的椅子和目标数组自动填充来自其各自集合的椅子和目标文档的整个可用列表。但是,这不是填充所做的。它是跨集合关联特定文档的一种方法。换句话说,您必须手动将新主席文档与TransportModel文档关联。.populate方法将在查询期间自动添加相关文档。请参阅文档:感谢您的快速回复。如果我理解正确,这意味着我必须首先将所有与chairs数组中的chairs文档关联的_id值推送到chairs数组中,然后再推到chairs数组中?这意味着我仍然必须开火。找到{}查询并将椅子推到椅子数组中?如果最后一行的意思是您已经有很多椅子,并且希望将它们添加到TransportModel文档中,那么是的。但是,如果您想将所有椅子和目标与特定的TransportModel文档相关联,填充似乎没有什么意义,您可能应该为每个集合/模型运行三个不同的查询,一个查询。为什么这样会更好?
var mongoose = require('mongoose');
var deepPopulate = require('mongoose-deep-populate')(mongoose);
var Schema = mongoose.Schema;
var kindsSchema = new Schema({
name:{type:String,required:true,unique:true},
components:[{type:Schema.ObjectId,ref:'components'}],
associatedView:{type:String,default:'home/fragances'},
discount:{type:Number,default:0},
description:{type:String,default:'Nueva categoria'},
created_at:{type:Date,default:Date.now},
modified_at:{type:Date,required:true}
});
kindsSchema.plugin(deepPopulate,{
whitelist:[
'components.attributes',
]
populate:{
'components':{
select['attributes','discount']
}
}
});