在mongoose中存引用的时候如果是多级,查询的时候填充引用字段会使用populate,如下:
定义一个User,有字段friends每一项是自己collection的ObjectId。
// file: user-schema.js
let mongoose = require('mongoose')
let ObjectId = mongoose.Schema.Types.ObjectIdmodule.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.ObjectIdmodule.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.ObjectIdmodule.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中定义的。
我的理解是:准确的说多级是需要填充的字段是填充过后出现的。而字段的嵌套不能说是多级,至少我是这么认为的。