mongoose populate 文档字段说明
- path «Object|String» 需要做表关联的字段路径,或者包含所有参数的对象
- [select] «Object|String» 表关联查询要选择的字段
- [model] «Model» 表关联的 model 。如果没有指定,将以 Schema 中
ref
字段为名称查找 model 进行关联。 - [match] «Object» population 查询的条件
- [options] «Object» population 查询的选项 (sort 等)
首先,进入正题,我们定义三个Schema
auditOpinion = new Schema({
drId: { type: Schema.ObjectId, ref: 'drFile' },
cityId: Schema.ObjectId,
remark:String
});
drFile = new Schema({
name: { type: String, required: true, unique: true },
pwd: String,
cityId: { type: Schema.ObjectId, ref: 'cityFile' }
});
cityFile = new Schema({
name: String
});
表auditOpinion的drId属性指定表drFile的_id,表drFile的属性cityId指定表cityFile的_id。find()对应auditOpinion表对筛选条件,这是一种嵌套关联的关系。
查找auditOpinion表的数据,并同时返回对应的sales表的数据,可以使用下面的方法:
auditOpinion.find().populate('drId', '_id name pwd cityId').exec(function(err, data) {
if(err)console.log(err)
console.log(data)
});
返回的结果中除了auditOpinion表的数据外,还会包含drFile中_id,name,pwd,cityId四个属性的值。但是cityId属性的值是以ObjectId的形式显示的,如果想知道cityId对应表的其它值,则需要再次嵌套populate。代码如下
auditOpinion
.find() //对应结果查询
.populate({
path: 'drId', //对应auditOpinion表 设置字段
populate: {
//相当于then,在嵌套查询后,再在drFile表中根据cityId字段对cityFile表进行关联查询
path: 'cityId',
}
})
如果auditOpinion表中还存在其它ObjectId类型的字段,则可以在populate方法后面继续追加populate,使用方法相同
注意:如果在定义字段类型的时候,没有加上ref:"表名",则需要在使用populate的时候,增加一个model 指向对应的表,这样才能正确查询出结果,如下:
auditOpinion
.find() //对应结果查询
.populate({
path: 'dr_id', //对应auditOpinion表 设置字段
})
.populate({
//一张表可联合多个表字段,根据auditOpinion中的字段cityId对cityFile表进行关联查询
path: 'cityId',
model:'cityFile'//没有添加ref路径,则需要指向
})
mongoose 传送门
https://cn.mongoosedoc.top/docs/api.html#query_Query-populate
https://cn.mongoosedoc.top/docs/populate.html