在mongoose中存引用的时候如果是多级,查询的时候填充引用字段会使用populate,如下:
定义一个User,有字段friends每一项是自己collection的ObjectId。
// file: user-schema.js
let mongoose = require('mongoose')
let ObjectId = mongoose.Schema.Types.ObjectId
module.exports = new mongoose.Schema({
name: String,
friends: [{type: ObjectId, ref: 'User'}]
})
// file: user-model.js
let mongoose = require('mongoose')
let userSchema = require('./user-schema.js')
module.exports = mongoose.model('User', userSchema)
定义一个commentSchema有字段from是User的_id,还有嵌套字段reply每一项是一个document有字段from和to都是User的_id
// file: comment-schema.js
let mongoose = require('mongoose')
let ObjectId = mongoose.Schema.Types.ObjectId
module.exports = new mongoose.Schema({
from: {type: ObjectId, ref: 'User'},
content: String,
reply: [
{
to: {type: ObjectId, ref: 'User'},
from: {type: ObjectId, ref: 'User'},
content: String
}
]
})
下面开始查询。
// file: comment-model.js
let mongoose = require('mongoose')
let ObjectId = mongoose.Schema.Types.ObjectId
module.exports = mongoose.model('Comment', userSchema)
let Comment = require('./comment-model.js')
Comment.findOne({})
.populate('from') // 填充from字段
.populate('reply.to reply.from') // 填充reply字段下的to和from
注意:reply下的字段to和from的填充,并不是mongoose官文populate章节中的多级填充。
// file: comment-model.js
Coment.findOne({})
.populate({path: 'from', populate: {path: 'friends'}})
填充from字段查询出来的结果中的friends字段才是多级填充。
多级指的是需要填充的字段是在查询出来的数据对应的Schema中定义的。而第一个查询的填充类型的定义都是在comment-schema.js
中,无论是from字段还是reply下面的to和from。而第二个查询的字段from是在comment-schema.js
中定义,但是查询出来的document User 中的friends字段则是在user-schema.js中定义的。
我的理解是:准确的说多级是需要填充的字段是填充过后出现的。而字段的嵌套不能说是多级,至少我是这么认为的。