Mongoose使用populate进行多表嵌套及深层嵌套查询功能

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

猜你喜欢

转载自blog.csdn.net/qq_24678987/article/details/84136943