質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1673閲覧

MongoDB(Mongoose)のリレーションについて

maskmelon

総合スコア63

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/09 15:00

編集2020/08/09 15:17

###実現したいこと
Node.jsとMongoDBを使って二択の質問をユーザーが投稿、回答できるアプリを作成しています。
回答の集計結果を表示させる際に、ユーザーの年齢、性別ごとのグラフを描画できるようにデータベースを設計しており、特定の質問からそれに紐付くユーザー情報にアクセスできるようにしたいのですが、クエリの書き方でつまずいています。

###該当するコード
UserとQuestionの各スキーマは下記の通りです。

JavaScript

1//UserModel 2const userSchema = new mongoose.Schema({ 3 username: { 4 type: String, 5 required: true, 6 unique: true, 7 }, 8 gender: { 9 type: String, 10 }, 11 age: { 12 type: Number, 13 }, 14 //ユーザーが回答した質問とその答え 15 answers: [{ 16 _id: { 17 type: mongoose.Schema.Types.ObjectId, 18 ref: 'Question', 19 }, 20 answer: { 21 type: String, 22 }, 23 }], 24  //ユーザーが投稿した質問 25 postedQuestions: [{ 26 type: mongoose.Schema.Types.ObjectId, 27 ref: 'Question', 28 }] 29});

JavaScript

1//QuestionModel 2const questionSchema = new mongoose.Schema({ 3 title: { 4 type: String, 5 require: true, 6 }, 7 ansA: { 8 type: String, 9 require: true, 10 }, 11 ansB: { 12 type: String, 13 require: true, 14 }, 15 //Aと回答したユーザー 16 usersSelectedA: [ 17 { 18 type: mongoose.Schema.Types.ObjectId, 19 ref: 'User', 20 21 } 22 ], 23  //Bと回答したユーザー 24 usersSelectedB: [ 25 { 26 type: mongoose.Schema.Types.ObjectId, 27 ref: 'User', 28 } 29 ], 30  //質問の投稿者 31 createdBy: { 32 type: mongoose.Schema.Types.ObjectId, 33 ref: 'User', 34 }, 35}); 36

###発生している問題
イメージ説明

上の画像で示したusersSelectedAの配列の中に入っているユーザー情報を取り出したいです。

JavaScript

1const question1 = await Question.findOne( {title: 'どっち派?' }).populate('createdBy').exec(); 2console.log(question1.createdBy.age);

例えば、質問の投稿者データ(createdBy)には上のようなクエリで到達することができるのですが、回答者データ(usersSelectedA)は配列に入っているため、取り出し方が分かりません。

何かアドバイスを頂けないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

JavaScript

1const question = await Question.findOne({ ansA: '犬派' }) 2 .populate({ path: 'usersSelectedA' }) 3 .populate({ path: 'usersSelectedB' }); 4 5const arr = question.usersSelectedA; 6 7 arr.forEach((val) => { 8 if (val.age > 20) console.log(val); 9 });

上のような記述で配列に入っているユーザーデータを参照することができました。

投稿2020/08/17 15:33

maskmelon

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問