2017-04-27 4 views
0

Webアプリケーションを構築しようとしています。mongoose findメソッドからデータを取得し、他のスキーマに挿入する

ウェブサイトでは、mongooseからmongodbからインストラクターデータを取得する必要があり、その中のいくつかは他のスキーマ(Course)に挿入されます。

if (!req.body) return console.log("No data sent"); 
    var newcourse; 
    var iname = req.body.iname; 
    var results; 


/*ilist.find({ name: iname }).toArray((err, result) => { 
    if (err) return console.log(err); 
    results = result; 
});*/ 
dbs.collection('instructors').find({ name: iname }).toArray((err, result) => { 
    results = result; 
    //console.log(result);   
}); 
// console.log(ilist.data); 

newcourse = new clist({ 
    'coursename': req.body.coursename, 'coursenumber': req.body.coursenumber, 'coursecredit': req.body.coursecredit 
    , 'courseroom': req.body.room, 'instructors.name': req.body.iname, 'instructors.email': results.email, 'instructors.phone': results.phone, 'instructors.role': req.body.role 
}); 

newcourse.save(function (err) { 
    if (err) { 
     console.log(err); 
     res.status(400); 
     res.send(err); 
    } 
    else { 
     res.status(200); 
     console.log('A new course has been registered!'); 
     res.redirect('/course'); 
    } 
}); 

-----スキーマ-------------------

var instructorlist = mongoose.Schema({ 
    name: { type: String, required: true }, 
    age: { type: Number, required: true }, 
    gender: { type: String, required: true }, 
    DOB: { type: Date, required: true, default: Date.now }, 
    email: { type: String, required: true }, 
    phone: { type: Number, required: true }, 
    address: { type: String, required: true }, 
    dateofstart: { type: Date, required: true}, 
    courses: { 
     coursename: { type: String, required: false }, 
     coursenumber: { type: Number, requird: false }, 
     coursecredit: { type: Number, required: false }, 
     courseroom: { type: String, required: false } 
    } 
}); 
var courselist = mongoose.Schema({ 
    coursename: { type: String, required: true }, 
    coursenumber: { type: String, required: true }, 
    coursecredit: { type: Number, required: true }, 
    courseroom: { type: String, required: false }, 
    courseregisteddate: {type: Date, default: Date.now}, 
    students: { 
     name: { type: String, required: false }, 
     phone: { type: Number, requird: false }, 
     email: { type: String, required: false }, 
     class: { type: String, required: false } 
    }, 
    instructors: { 
     name: { type: String, required: false }, 
     phone: { type: Number, requird: false }, 
     email: { type: String, required: false }, 
     role: { type: String, required: false } 
    } 
}); 

私はinstuctorlistの電子メールと電話を取得したい。(他の人req.bodyのものです)、 はmongodbに保存するためにnewcourse変数に入れます。 ありがとうございます。

答えて

0

instructors find関数は非同期に呼び出されるため、そのmongooseクエリの結果を得る前にjavascriptコードが実行されます。

コースの保存をコールバック内に追加する必要があります。

if (!req.body) return console.log("No data sent"); 
 

 
dbs.collection('instructors').find({ 
 
    name: req.body.iname 
 
}).toArray((err, instructors) => { 
 
    if (!err) { 
 
    if (!instructors) { 
 
     var newcourse = new clist({ 
 
     // new data also from instructors 
 
     }); 
 

 
     newcourse.save(function(err) { 
 
     if (err) { 
 
      res.status(400); 
 
      res.send(err); 
 
     } 
 
     else { 
 
      res.status(200); 
 
      res.redirect('/course'); 
 
     } 
 
     }); 
 
    } 
 
    else { 
 
     res.status(400); 
 
     res.send("Could not find instructor"); 
 
    } 
 
    } 
 
    else { 
 
    res.status(400); 
 
    res.send(err); 
 
    } 
 
});

しかし、これであなたは、指定された名前を持つすべてのインストラクターを取得し、その配列からいずれかを選択する必要があることに注意してください:このようになります。インストラクターにさらにコースを保存する場合は、スキーマを変更する必要があります。

var courseSchema = mongoose.Schema({ 
 
    // Schema variables 
 
    ... 
 

 
}); 
 

 
var courseModel = mongoose.model("Course", courseSchema); 
 

 
var instructorlist = mongoose.Schema({ 
 
    name: { 
 
    type: String, 
 
    required: true 
 
    }, 
 

 
    ... 
 

 
    courses: [{ 
 
    type: ObjectId, 
 
    ref: "Course" 
 
    }] 
 
});

+0

答えをいただき、ありがとうございます。私はそれを試み、同様のケースを見たが、正確に理解していない。もう一度ありがとうございます:) –

+0

refはコースを指すことを意味します。どうもありがとうございました! –

+0

はいrefは、コースのIDをデータベースのインストラクターテーブルに保存します。したがって、同じ値を再度保存する必要はありません。実際の値を取得するには、 'populate'を使用する必要があります。その機能も見てください –

関連する問題