需要对 mongoose/mongodb 填充命令进行一些说明

Need some clarification on mongoose/mongodb populate command

你好,我正在与用户和 posts 一起制作一个基本的应用程序。

我遵循了有关人口的猫鼬文档 (http://mongoosejs.com/docs/2.7.x/docs/populate.html) 并设置了我的模式,以便用户连接到 posts

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 中,但是当我尝试考虑如何显示所有帖子时posts 及其各自的用户附加到每个 post 我不确定如何将两者联系起来,因为 mongoose 文档中的所有示例主要针对 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 post in posts %} ,当我执行 post._user 时,它会显示整个用户架构,但是当我执行 post._user.username 时,它​​不会 return 任何内容。我不确定这是为什么。

构建查询填充的正确方法是这样的:

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

然后您将得到一个 Posts 数组,其中填充了 _user 数组。如果您需要访问用户的 属性,您将需要通过 _user 数组进行另一个循环或指定您要使用 _user[0].<property>