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了。

  

 

posted @ 2016-10-26 13:32  宋体四号  阅读(1508)  评论(0编辑  收藏  举报