2017-07-30 9 views
0

参照されたデータを別のオブジェクト内からログに記録するのに問題があります。参照されたオブジェクト属性をconsole.log()に取得する

私は現在、2つのモデルを持っている...

するvarマングース=は、( "マングース")を必要とします。

STUDENT:

var gameSchema = new mongoose.Schema(
    { 
     name: String, 
     courses: [ 
      { 
       type: mongoose.Schema.Types.ObjectId, 
       ref: "Course" 
      } 
     ] 
    }); 

module.exports = mongoose.model("Student", gameSchema); 

コース:私はCONSOLE.LOG

var mongoose = require("mongoose"); 

var courseSchema = new mongoose.Schema (
    { 
     name: String, 
     student: [ 
      { 
       id: 
       { 
        type: mongoose.Schema.Types.ObjectId, 
        ref: "Student" 
       }, 
       name: String 
      } 
     ] 
    } 
); 

module.exports = mongoose.model("Course", courseSchema); 

は(foundStudent.courses [0] .nameの)私は未定義取得し、私はその理由を把握することはできません。..ここで

app.post("/students/:id", function(req, res){ 
    Student.findById(req.params.id, function(err, foundStudent){ 
     if(err){ 
      console.log(err); 
     } else { 
      Course.create(req.body.class, function(err, createdCourse){ 
       if(err){ 
        console.log(err); 
       } else { 

        createdCourse.student.push(foundStudent); 
        createdCourse.save(); 

        foundStudent.courses.push(createdCourse); 
        foundStudent.save(); 
        res.redirect("/students/" + req.params.id); 
       } 
      }); 
     } 
    }); 
}); 

は...ショーのページです

<div> 
    <h1>Student Profile</h1> 
    <h2>Name: <%=student.name%></h2> 
    <div> 
     <h3>Classes: 
      <form action="/students/<%= student._id %>" method="POST"> 
       <% student.courses.forEach(function(course){ %> 
        <li><p><%= course.name %></p></li> 
       <% }); %> 
      <a href="/students/<%=student._id%>/courses/new">Add Course</a> 
      </form> 
     </h3> 
    </div> 
</div> 
+0

参照オブジェクトを自動的に取得するには、[populate](http://mongoosejs.com/docs/populate.html)を使用する必要があります。 –

+0

これはルートを取得する必要がありますはい? –

+0

はい、 'DocumentQuery'オブジェクトを返すfindメソッドの後です。これは、コールバックがDocumentQueryオブジェクトの 'exec'メソッドに移動されなければならないことを意味します。例えば' Student.findById(id).populate( 'courses')。exec((err、res)=> ...) '。 –

答えて

0

mockgoosemochaを使用して簡単なテストスイートを追加して、DocumentQuery.populateの使用方法を示しました。

学生スキーマ

const schema = mongoose.Schema({ 
    name: String, 
    courses: [{ type: mongoose.SchemaTypes.ObjectId, ref: 'Course' }] 
}); 

module.exports = mongoose.model('Student', schema); 

コーススキーマ

const schema = mongoose.Schema({ 
    name: String, 
}); 

module.exports = mongoose.model('Course', schema); 

テストスイート

const mongoose = require('mongoose'); 
const mockgoose = new (require('mockgoose').Mockgoose)(mongoose); 

const { assert, expect } = require('chai'); 

const Student = require('../models/student'); 
const Course = require('../models/course'); 

var student = null; 

before(done => { 
    mockgoose.prepareStorage().then(res => { 
     mongoose.connect('mongodb://test/testDB', (err) => { 
      if (err) { 
       return done(err); 
      } 

      student = new Student({ 
       name: 'Shane' 
      }); 

      student.save(err => { 
       done(err); 
      }); 
     }); 
    }); 
}); 

describe('population',() => { 
    it('should populate referenced collection', done => { 
     let course = new Course({ 
      name: 'Applied Sciences' 
     }); 

     // save mock course 
     course.save(err => { 
      if (err) { 
       return done(err); 
      } 

      student.courses.push(course._id); 

      // push changes 
      student.save(err => { 
       if (err) { 
        return done(err); 
       } 

       // you can use any other find method that returns a DocumentQuery object 
       Student.findOne({ 
        name: 'Shane' 
       }).populate('courses').exec((err, res) => { 
        if (err) { 
         return done(err); 
        } 

        expect(res.courses).to.have.lengthOf(1); 

        assert.equal(res.courses[0].name, 'Applied Sciences'); 

        done(); 
       }); 
      }); 
     }); 
    }); 
}); 

mochaを使用して、上記、アサーションが渡され、生徒のオブジェクトが1つ設けられている実行コース。

もう1つ注意すべきことは、オブジェクトのバッチを一度にプッシュするためにSchema.createが使用されていることです。 doc.saveまたはSchema.createを使用するかどうかは議論の余地があります。 createメソッドは実際にはドキュメントの配列だけを受け入れますが、1つのオブジェクトが渡されたときにはフォールバックを持ちます。すべてのドキュメントオブジェクトの保存を呼び出し、すべてのドキュメントが保存されると解決します。

+0

ありがとう、私はモカ/チェーンの短期コースをあまりにもずっと前に取ったし、何らかの理由で悲しいことにそれを使い続けなかった。私はまだ初心者です。問題は実際には完全に冗長なものでした。私のフォームでは、name = "course [name]"に "name"を設定しましたが、私のコードではreq.body.name ..... –

+0

@CollinDeSoto私が気付いたことは、学生のコースコレクションへのID参照ではなくオブジェクト( 'コース')をプッシュすることです。コースの1つを更新すると、その学生の予定コースは更新されません。 –

+0

私はコースを押しているはずです._id? –

関連する問題