我有一个受害者模式:
let Victim= new Schema({
name: {type: String},
gender: {type: String},
Id: {type: String},
address: {type: String},
});
a罪犯模式:
let Culprit= new Schema({
name: {type: String},
gender: {type: String},
cellphone: {type: String},
address: {type: String},
});
和一个案例模式:
let Case= new Schema({
victims:[String],//this contains array of victims _id's
culprits:[String],//this contains array of culprit _id's
aboutCase:{type:String},
caseType:{type:String},
date:{type:String}
})
请注意,Case模式的受害者字段包含受害者的_id,而罪犯字段包含罪犯的_id。这两个字段都是数组。
现在,如果我这样做:
Case.find(function(err, allTheCases) {
if (err) {
console.log(err);
} else {
res.json(allTheCases);
//Question : How to get victims and culprits data as complete objects instead of just array of _id's
}
});
结果,allTheCases
是所有Case对象的数组,其中每个对象都包含受害者字段。此受害者字段包含受害者_id的数组。
我的问题是:正确的查询语法是什么,这样最终结果(allTheCases
(将具有受害者和罪犯对象的完整数组,而不仅仅是受害者和罪犯的_id数组?
您要查找的是mongodb聚合管道中的$lookup
{
$lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}
或者,如果你使用Mongoose ODM,你可以用相应的方法填充必要的字段:
let Case= new Schema({
victims:[{ type: Schema.Types.ObjectId, ref: 'Victim' }],
culprits:[{ type: Schema.Types.ObjectId, ref: 'Culprits'}],
aboutCase:{type:String},
caseType:{type:String},
date:{type:String}})
查询时:
Case.find().
populate('victims').
populate('culprits').
exec(function (err, cases) {
});