表关联

140 阅读1分钟

文档日期:2021/2/2

参考文档:mongoose 5.x中文文档 链接地址

文档记录:刘俊雄

涉及到用户信息的使用 populate 其它场景使用聚合查询 并且注意表名是否是复数形式的

表关联在创建表规则时,就要指定好需要关联的字段和表

let mongoose = require('mongoose');
let order = mongoose.model('user',new mongoose.Schema({
    order_name:{
        type:String,
        required:true
    },
    order_num:{
        type:Number,
        required:true
    },
    // 这里我们使用 user_id 字段 关联 user 用户表
    user_id:{
        // 类型设置为id
        type:mongoose.Schema.Types.ObjectId,
        // 需要关联的表
        ref:'user'
    }
}))

在查询的时候需要查看关联的信息时这样来做,使用 populate

order.findOne(...).populate('user_id').exec(function (err, kitten) {
  console.log(kitten.owner.name) // Max
})

order.find(...).populate({
    path: 'user_id'
  , select: 'name'
  , match: { color: 'black' }
  , options: { sort: { name: -1 }}
}).exec(function (err, kittens) {
  console.log(kittens[0].owner.name) // Zoopa
})

// alternatively
order.find(...).populate('user_id', 'name', null, {sort: { name: -1 }}).exec(function (err, kittens) {
  console.log(kittens[0].owner.name) // Zoopa
})

填充多个字段

要一次填充多个字段怎么办?

Story.
  find(...).
  populate('fans').
  populate('author').
  exec();

如果对同一路径 populate() 两次,只有最后一次生效。

// 第二个 `populate()` 覆盖了第一个,因为它们都填充 fans
Story.
  find().
  populate({ path: 'fans', select: 'name' }).
  populate({ path: 'fans', select: 'email' });
// The above is equivalent to:
Story.find().populate({ path: 'fans', select: 'email' });

Parameters

  • path «Object|String» 需要做表关联的字段路径,或者包含所有参数的对象
  • [select] «Object|String» 表关联查询要选择的字段
  • [model] «Model» 表关联的 model 。如果没有指定,将以 Schema 中 ref 字段为名称查找 model 进行关联。
  • [match] «Object» population 查询的条件
  • [options] «Object» population 查询的选项 (sort 等)

字段的表关联在查询结束并收到响应之后执行。每个指定表关联的路径都由一个独立的查询执行。收到所有查询的响应之后,查询结果被传递给回调函数。