7

これが未熟な質問でしたら申し訳ありません。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 つだけですが、最初にここから始めようと思いました。

4

9 に答える 9

-1

モデルの名前を持つ文字列ではなくモデルクラス参照として参照を宣言したときに、この問題を解決することができました。

// before
let Schema = mongoose.Schema({
    name: String,
    author: { type: Schema.Types.ObjectId, ref: 'Author' }
});

//after
let Schema = mongoose.Schema({
    name: String,
    author: { type: Schema.Types.ObjectId, ref: Author }
});
于 2020-02-25T12:16:21.103 に答える