これが未熟な質問でしたら申し訳ありません。Google と Stack を何時間も検索してきましたが、質問しなければなりません!
以下に示すように、ユーザーとストーリーの 2 つのスキーマがあります。クエリに入力する Ref オプションを使用してストーリーのユーザーを参照しようとしています - 以前に mySQL を使用していたので、JOIN ステートメントを複製しようとしました。populate を使用しようとするたびに、objectID が返されるか、null が返されます (以下を参照)。
ハードコードされた ID を修正し、コンソール データを追加するために 11 月 12 日に編集されました
ストーリースキーマ.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
User = require('./user-schema');
var StorySchema = new Schema({
title: { type: String, required: true },
author_id: { type: Schema.Types.ObjectId, ref: 'User' },
summary: { type: String, required: true },
rating: { type: String, required: true }
});
module.exports = mongoose.model('Story', StorySchema, 'stories');
ユーザースキーマ.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var UserSchema = new Schema({
username: { type: String, required: true, index: { unique: true } },
is_admin: {type: Boolean, required: true, default: false }
});
保存 - たとえばハードコードされた ID
app.post('/api/new_story', function(req, res){
var story;
story = new Story({
title: req.body.title,
author_id: mongoose.Types.ObjectId(req.params._id),
/* ex of req.params._id: 527fc8ff241cdb8c09000003*/
summary: req.body.summary,
rating: req.body.rating
});
story.save(function(err) {
if (!err) {
return console.log("created");
} else {
return console.log(err);
}
});
return res.send(story);
});
端末にログインしたときのユーザー例
{
"__v" : 0,
"_id" : ObjectId("527fc8ff241cdb8c09000003"),
"is_admin" : false,
"username" : "ted"
}
端末ログイン時のストーリー例
{
"title" : "Test Story",
"author_id" : "527fc8ff241cdb8c09000003",
"summary" : "Test summary",
"rating" : "12",
"_id" : ObjectId("52827692496c16070b000002"),
"__v" : 0
}
クエリ
//other mongoose/app includes above
User = require('./config/schema/user-model'),
Story = require('./config/schema/story-model');
// data.author_id = 527fc8ff241cdb8c09000003
// data.author_id.username = undefined
app.get('/api/query/:id', function (req, res){
return Story.findOne({_id:req.params.id})
.populate( { path: 'User' } )
.exec(function (err, data) {
console.log(data.author_id);
console.log(data.author_id.username);
if (err) {
return res.json({error:err})
}
})
});
// data.author_id = null
app.get('/api/query2/:id', function (req, res){
return Story.findOne({_id:req.params.id}) //_id hardcoded for example
.populate( 'author_id' )
.exec(function (err, data) {
console.log(data.author_id);
if (err) {
return res.json({error:err})
}
})
});
最初のクエリでは、既に保存した author_id を取得します。これは保存したものなので意味がありますが、ユーザー名にアクセスします。
2 番目のクエリでは、既に保存した author_id にアクセスすることさえできません。
編集:「populate」なしで通常のGETクエリを正常に実行できます
私がしたいこと
ストーリーから著者情報にアクセスできるようにすることです。これは概念実証のようなものです。最終的には、User モデルで Story _id を参照したいと思います。ユーザーには多くのストーリーが存在する可能性がありますが、ストーリーごとにユーザーは 1 つだけですが、最初にここから始めようと思いました。