如何基于引用键检索模式的其他详细信息

时间:2014-08-02 13:26:08

标签: mongodb express mongoose mongoose-populate

我正在开展一个项目。我有一个评论架构,喜欢架构和博客架构。所有这三个都被声明为单独的模式,但是喜欢和评论模式然后嵌套到博客模式中作为子项,即注释:[CommentSchema]。现在我有一个页面,当有人点击博客时,它会显示所有评论和博客。这个代码获取博客Blog.findById(id).populate('用户','用户名')。exec(函数(错误,博客)。现在在comments数组中是一个名为commOwner的密钥,它引用来自另一个名为user的模式的objectid,就像博客模式有一个引用密钥一样,你可以从代码中看到。我试图显示每个人做出评论的gravatar和用户名在评论模式中的参考密钥commOwner,但我不知道如何去做。我也希望能够填充那些在博客评论的用户名和gravatar代码,我为博客做了。请有人帮助我。下面是我所有架构的代码

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;


/*Comment schema*/
var CommentSchema = new Schema({
    commOwner: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    commbody: {
        type: String,
        default: '',
        trim: true,
        //required: 'Comment cannot be blank'
    },
    updated: {
        type: Date,
        default: Date.now
    }
});

/**
 * Likes Schema
 */
var LikeSchema = new Schema({
    score : {
        type: Number,
        default: 0
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});


/**
 * Blog Schema
 */
var BlogSchema = new Schema({
    created: {
        type: Date,
        default: Date.now
    },
    title: {
        type: String,
        default: '',
        trim: true,
        required: 'Title cannot be blank'
    },
    content: {
        type: String,
        default: '',
        trim: true
        //required: 'Content cannot be blank'
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    },
    comments: [CommentSchema],
    likes: [LikeSchema]

});

mongoose.model('Blog', BlogSchema);

1 个答案:

答案 0 :(得分:0)

Blog.findById(id).
  populate(
     [{path:'user', select:'username'},
     {path:'comments.commOwner',select:'username profilepic ...'}])
  .exec(function(err, blog){...})

select字段中,指定要在commOwner中填充的其他字段(以空格分隔)。 看看the docs