文档日期: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 等)
字段的表关联在查询结束并收到响应之后执行。每个指定表关联的路径都由一个独立的查询执行。收到所有查询的响应之后,查询结果被传递给回调函数。