2016-11-02 21 views
0

こんにちは、私はユーザーと投稿で基本的なアプリを作っています。mongoose/mongodb populateコマンドの説明が必要

ユーザーとは

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); } 
    }); 

}); 

ザッツすべての罰金と肉汁ポストに接続されるように、私は私のスキーママングース人口のドキュメント(http://mongoosejs.com/docs/2.7.x/docs/populate.html)とセットアップに続いて、私は実行することができますforeachループでallPostsを使ってHTML内のそれぞれを引っ張るのですが、どの投稿をそれぞれの投稿に添付してすべての投稿を表示するかを考えようとすると、どのように2つを接続するのか分かりません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); } 
    }); 

}); 

のようなものを考えていたが、それはもちろん、動作しません。

このような状況の経験があれば誰でも私がこれを解決するのに役立つだろうかと思いました。

入力いただきありがとうございます。私はちょうど私のループでは

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

{ポスト%でポストのため%} で私が正しくするフィールドを引っ張るカント

EDIT、私は正常に動作する移入を取得することができたDAVESヘルプのおかげで、私がpost._userを実行すると、ユーザーのスキーマ全体が表示されますが、post._user.usernameを実行すると何も返されません。なぜこのようなことがわかりませんか。

+0

次のようにクエリを変更する必要があります。 populate( '_ user')。exec((err、allposts){...}) '。それはすべての 'Post'ドキュメント' user'プロパティを設定し、それをドキュメントの1つのコレクションとして返します。 –

+0

こんにちはデイブ、返信して構文をクリアしていただきありがとうございます。 foreachループを呼び出すとpost._user.usernameが呼び出されますが、何も返されませんが、post._userを呼び出すと、ユーザーの全オブジェクトが戻ってきます。何らかの理由で各フィールドindividualiasullyにアクセスできなくなります。あなたの助けをもう一度ありがとう – 0xef2387

+0

あなたは '_user'配列のforeachをやっていますか? –

答えて

0

クエリに移入を構造化するための適切な方法は、このようなものです:

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

次に、あなたが読み込ま_user配列を使用してPostsの配列を持つことになります。ユーザーのプロパティにアクセスする必要がある場合は、_user配列を使用して別のループを実行するか、使用することを指定する必要があります_user[0].<property>

+0

完璧に動作します。乾杯! – 0xef2387