mongoose 嵌套查询之Populate方法使用
这是我在用Nodejs + express + mongoose 开发一个博客系统的时候遇到的一个问题。首先我定义了三个Schema,如下:
/* * comment.js
*/ var mongoose = require('mongoose'); var Schema = mongoose.Schema; var User = require('./user.js'); var Blog = require('./blog.js'); var Comment = new Schema({ author: {type: Schema.Types.ObjectId,ref:'user'}, //作者,定义外键 content: {type: String, require:true}, //评论内容 blog: {type: Schema.Types.ObjectId,ref:'Blog'}, time : Date, //评论发布时间 recommend: Number }); module.exports = mongoose.model('comment', Comment); /* * user.js */ var mongoose = require('mongoose'); var Schema = mongoose.Schema; var passportLocalMongoose = require('passport-local-mongoose'); var User = new Schema({ username: String, password: String }); User.plugin(passportLocalMongoose); module.exports = mongoose.model('user', User); /* * comment.js */ var mongoose = require('mongoose'); var Schema = mongoose.Schema; var User = require('./user.js');var BlogSchema = new Schema({ title: {type: String, require: true}, //博客标题 content: {type: String, require: true}, //博客内容 author: {type: Schema.Types.ObjectId,ref:'User'}, //作者,定义外键 time : Date, //博客发布时间 recommend: Number, //博客被赞次数 // comment: {type: Schema.Types.ObjectId,ref:'Comment'} //评论 }); module.exports = mongoose.model('blog', BlogSchema);
在Comment的Schema定义中,author的类型ObjectId对应User集合中的_id。
那么现在如果要查询一个评论的作者信息(用户名)该怎么处理呢?
如果直接
Comment.findById(req.params.blogId).exec((err,comment) =>{ if (err) { console.log(err); } else { console.log("作者信息" +comment[0].author); } });
输出的只是作者的_id,如果你不怕麻烦就根据_id去User集合再找一次。
那么怎么去直接获取username呢,就要用到Populatele了。
Comment.find({blog:req.params.blogId}).populate('author').exec((err,comments) =>{ if (err) { console.log(err); } else { console.log("+++++++++",comments[0].author.username); } });
这么处理一下就可以直接使用username了。