需要对mongoose / mongodb populate命令

时间:2016-11-02 19:54:30

标签: node.js mongodb express mongoose populate

您好,我正在制作一个包含用户和帖子的基本应用。

我按照关于人口(http://mongoosejs.com/docs/2.7.x/docs/populate.html)的mongoose文档进行操作并设置我的架构,以便用户连接到帖子

var userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
email:  String,
created_at: Date,
updated_at: Date,
admin: Boolean,
posts: [{ type: mongoose.Schema.ObjectId, ref: 'Post' }]
});

var postSchema = new mongoose.Schema({
_user : [{ type: mongoose.Schema.ObjectId, ref: 'User' }],
audioFile: { type: String, required: true },
imageFile: { type: String },
title: { type: String, required: true },
artist: { type: String, required: true },
start: { type: String, required: true },
stop: { type: String, required: true },
genre: { type: String, required: true },
tags: [{ type: String }]

});
app.get('/', function (req, res){
    Post.find({}, function(err, allPosts){
        if(!err){
            res.render('main.njk', {
                posts : allPosts,
                title : 'Title',
                isLogged : req.session.isLogged,
                user : req.session.user,
                messages : req.flash('alert')
            });
        } else { return done(err); }
    });

});

这一切都很好吃,我可以在allPosts上运行一个foreach循环来拉取我的HTML中的每一个,但是当我试着想出我将如何显示所有帖子时,每个帖子都附有各自的用户我我不确定如何连接这两个,因为mongoose doc中的所有示例主要用于findOne。

我在想这样的事情

app.get('/', function (req, res){
    Post.find({}, function(err, allPosts){
        if(!err){
            allPosts.populate('_user', ['username']);
            allPosts.exec(function (err, users){
                if(err) console.log(err);
                console.log(users); 
            });
            res.render('main.njk', {
                posts : allPosts,
                title : 'Spaurk.net',
                isLogged : req.session.isLogged,
                user : req.session.user,
                messages : req.flash('alert')
            });
        } else { return done(err); }
    });

});

但这当然不起作用。

所以我想知道是否有任何有这种情况经验的人能够帮我解决这个问题。

非常感谢任何意见。

编辑,感谢Daves帮助我能够让人们正常工作,我只是无法正确地拉出我想要的字段

    Post.find({}).populate('_user').exec(function(err, allPosts){

在我的循环{%for posts in posts%} 当我执行post._user时它会显示整个用户架构,但是当我执行post._user.username时它不会返回任何内容。我不确定为什么会这样。

1 个答案:

答案 0 :(得分:0)

在查询上构造填充的正确方法如下:

Post.find({})
    .populate('_user')
    .exec((err, allposts){...})

然后,您将拥有填充了Posts数组的_user数组。如果您需要访问用户的属性,则需要在_user数组中执行另一个循环,或使用您想要使用的_user[0].<property>指定