Id在mongodb数据库中保存为[object]

id is saving as [object] in mongodb database

本文关键字:object 保存 mongodb 数据库 Id      更新时间:2023-09-26

我正在学习MEAN stack,同时通过构建10个项目来学习node.js,我正在努力完成电子学习项目教程在注册类时有一个问题:class_id: [Object]

不要担心下面的代码,它是张贴的,以防你想看。

Json文件如何保存:

{ _id: 55f708806a7390500cb421ce,
  first_name: 'Madhur',
  last_name: 'Gupta',
  email: 'madhurgupta@mymail.com',
  username: 'madhur',
  __v: 0,
  classes:
   [ { class_title: 'HTML 101',
       _id: 55f708b46a7390500cb421d5,
       class_id: [Object] },
     { class_title: 'HTML 101',
       _id: 55f708be6a7390500cb421d6,
       class_id: [Object] } ],          // This class_id: [Object]
  address:
   [ { street_address: '007, Some street',
       city: 'My City',
       state: 'My State',
       zip: '141551',
       _id: 55f708806a7390500cb421cf } ] }

schema

var mongoose = require('mongoose');

//教师模式

var instructorSchema = mongoose.Schema({
  first_name: {
    type: String
  },
  last_name: {
    type: String
  },
  address: [{
      street_address: {type: String},
      city: {type: String},
      state: {type: String},
      zip: {type: String}
  }],
  username: {
    type: String
  },
  email: {
    type: String
  },
  classes: [{
      class_id: {type: [mongoose.Schema.Types.ObjectId]},
      class_title: {type: String}
    }]
});
var Instructor = module.exports = mongoose.model('instructor', instructorSchema);
module.exports.getInstructorByUsername = function(username, callback) {
  var query = { username: username };
  Instructor.findOne(query, callback);
}
// Register instructor for Class
module.exports.register = function(info, callback) {
    instructor_username = info['instructor_username'];
    class_id = info['class_id'];
    class_title = info['class_title'];
    var query = {username: instructor_username};
    Instructor.findOneAndUpdate(
      query,
      {$push: {"classes": {class_id: class_id, class_title: class_title}}},
      {safe: true, upsert: true},
      callback
    );
}

下面是类模式:

var mongoose = require('mongoose');
// Class Schema
var classSchema = mongoose.Schema({
  title: {
    type: String
  },
  description: {
    type: String
  },
  instructor: {
    type: String
  },
  lessons: [{
    lesson_number: {type: Number},
    lesson_title: {type: String},
    lesson_body: {type: String}
  }]
});
var Class = module.exports = mongoose.model('Class', classSchema);
// Fetch All Classes
module.exports.getClasses = function(callback, limit) {
  Class.find(callback).limit(limit);
}
// Fetch Single Class
module.exports.getClassesById = function(id, callback) {
  Class.findById(id, callback);
}
module.exports.addLesson = function(info, callback) {
  class_id = info['class_id'];
  lesson_number = info['lesson_number'];
  lesson_title = info['lesson_title'];
  lesson_body = info['lesson_body'];
  Class.findByIdAndUpdate(
      class_id,
      {$push: {"lessons" : {lesson_number: lesson_number, lesson_title: lesson_title, lesson_body: lesson_body}}},
      {safe: true, upsert: true},
      callback
    );
}

这是Instructor.js路由文件

var express = require('express');
var router = express.Router();
Class = require('../models/class');
Instructor = require('../models/instructor');
User = require('../models/user');
/* GET home page. */
router.get('/classes', ensureAuthenticated, function(req, res, next) {
  Instructor.getInstructorByUsername(req.user.username,
    function(err, instructor) {
    if (err) {
      console.log(err);
      res.send(err);
    } else {
      res.render('instructors/classes', {
        'instructor' : instructor
      });
    }
  });
});
router.post('/classes/register', function(req, res) {
  info = [];
  info['instructor_username'] = req.user.username;
  info['class_id'] = req.body.class_id;
  info['class_title'] = req.body.class_title;
  Instructor.register(info, function(err, instructor) {
    if (err) throw err;
    console.log(instructor);
  });
  req.flash('success', 'You are now registered to teach this class');
  res.redirect('/instructors/classes');
});
// Display the form to add classes
router.get('/classes/:id/lessons/new', ensureAuthenticated, function(req, res, next) {
  res.render('instructors/newlesson',
    {'class_id': req.params.id});
});
router.post('/classes/:id/lessons/new', ensureAuthenticated, function(req, res, next) {
  // Get Form Values
  var info = [];
  info['class_id'] = req.params.id;
  info['lesson_number'] = req.body.lesson_number;
  info['lesson_title'] = req.body.lesson_title;
  info['lesson_body'] = req.body.lesson_title;
  Class.addLesson(info, function(err, lesson) {
    console.log('Lesson added');
  });
  req.flash('success', 'Lesson Added');
  res.redirect('/instructors/classes');
});
function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  }
  res.redirect('/users/login');
}
module.exports = router;

这是classes.js的路由文件

var express = require('express');
var router = express.Router();
Class = require('../models/class');

router.get('/', function(req, res, next) {
  Class.getClasses(function(err, classes){
    if(err){
      console.log(err);
      res.send(err);
    } else {
      res.render('classes/index', { "classes": classes });
    }
  }, 3);
});
router.get('/:id/details', function(req, res, next) {
  Class.getClassesById([req.params.id],function(err, classname){
    if(err){
      console.log(err);
      res.send(err);
    } else {
      res.render('classes/details', { "class": classname });
    }
  });
});
router.get('/:id/lessons', function(req, res, next) {
  Class.getClassesById([req.params.id],function(err, classname){
    if(err){
      console.log(err);
      res.send(err);
    } else {
      res.render('classes/;esspms', { "class": classname });
    }
  });
});
router.get('/:id/lessons/:lesson_id', ensureAuthenticated, function(req, res, next) {
  Class.getClassesById([req.params.id],function(err, classname) {
    if(err){
      var lesson;
      res.send(err);
    } else {
        // loop through lessons to see if they equal :lesson_id
        for (i = 0; i < classname.lessons.length; i++) {
          if (classname.lessons[i].lesson_number == req.params.lesson_id) {
            lesson = classname.lessons[i];
          }
        }
        res.render('classes/lesson', {
          'class' : classname,
          'lesson' : lesson
        });
    }
  });
});
function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
 }
  res.redirect('/users/login');
}
module.exports = router;

这是包。json文件:

{
  "name": "eLearn",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "nodemon ./bin/www"
  },
  "dependencies": {
    "async": "^1.0.0",
    "bcryptjs": "*",
    "body-parser": "~1.8.1",
    "connect-flash": "*",
    "cookie-parser": "~1.3.3",
    "debug": "~2.0.0",
    "express": "~4.9.0",
    "express-handlebars": "*",
    "express-messages": "*",
    "express-session": "*",
    "express-validator": "*",
    "jade": "~1.6.0",
    "mongodb": "*",
    "mongoose": "*",
    "morgan": "~1.3.0",
    "passport": "*",
    "passport-http": "*",
    "passport-local": "*",
    "serve-favicon": "~2.1.3"
  }
}

根据您的示例,您不应该将instructorSchema中每个classes中的class_id字段声明为数组类型。

最可能的instructorSchema应该是这样的:

var instructorSchema = mongoose.Schema({
  ...,
  classes: [{
      class_id: {type: mongoose.Schema.Types.ObjectId},
      class_title: {type: String}
  }]
});