Использование поддокумента в приложении node / mongoose - PullRequest
0 голосов
/ 19 мая 2018

У меня есть следующая схема, определенная в двух файлах.

faultreport.js:

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var FaultReportSchema = new Schema(
  {
    reporter: {type: String, required: true, max: 128},
    comment: [{type: Schema.ObjectId, ref: 'Comment'}],
    status: {type: String, default: 'Reported', max: 64},
    datetime: {type: Date, required: true},
  }
);

module.exports = mongoose.model('FaultReport', FaultReportSchema);

comment.js

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var CommentSchema = new Schema(
  {
    commenter: {type: String, required: true, max: 128},
    comment: {type: String, required: true, max: 1024},
    datetime: {type: Date, required: true},
  }
);

module.exports = mongoose.model('Comment', CommentSchema);

Моя идея состоит в том, что каждый FaultReportсвязан с одним комментарием при создании, но дальнейшие комментарии могут быть добавлены позже.Я хотел бы построить экспресс-маршрут, который можно использовать для вывода списка всех FaultReports, включая строку комментария в связанном комментарии.

Я пытаюсь сделать это следующим образом.

router.get('/list_all', function(req, res, next) {
  FaultReport.find(function(err, reports) {
    if (err) return console.error(err);
    var data = [];
    for (var i = 0; i < reports.length; i++) {
      console.log(reports[i]);
      data.push([reports[i].datetime, reports[i].reporter, reports[i].comment[0].comment]);
    }
    res.render('list_all', {
      title: 'Fault List',
      data: data
    });
  });
});

Я явно неправильно понимаю, как работает экспресс / мангуст, и буду очень признателен за любую помощь или совет, который вы можете дать.Что я делаю неправильно?Что мне нужно сделать?

1 Ответ

0 голосов
/ 19 мая 2018

Благодаря комментариям Нила Ланна я выяснил свое недопонимание того, как работают MongoDB и Mongoose.

Я избавился от comment.js и переместил этот код в faultreport.js, который теперь выглядит какэто:

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var CommentSchema = new Schema(
  {
    commenter: {type: String, required: true, max: 128},
    comment: {type: String, required: true, max: 1024},
    datetime: {type: Date, required: true},
  }
);

CommentSchema.methods.getCommenter = function() {
  return this.commenter;
}

CommentSchema.methods.getComment = function() {
  return this.comment;
}

CommentSchema.methods.getDateTime = function() {
  return this.datetime;
}

var FaultReportSchema = new Schema(
  {
    reporter: {type: String, required: true, max: 128},
    comment: [CommentSchema],
    status: {type: String, default: 'Reported', max: 64},
    datetime: {type: Date, required: true},
  }
);

FaultReportSchema.methods.getReporter = function () {
  return this.reporter;
}

FaultReportSchema.methods.getCommentId = function () {
  return this.comment;
}

FaultReportSchema.methods.getStatus = function () {
  return this.status;
}

FaultReportSchema.methods.getDateTime = function () {
  return this.datetime;
}

module.exports = {
  'FaultReport': mongoose.model('FaultReport', FaultReportSchema),
  'FaultComment': mongoose.model('FaultComment', CommentSchema)
};

Маршрутизатор Express для этого выглядит следующим образом:

router.get('/list_all', function(req, res, next) {
  FaultReport.find(function(err, reports) {
    if (err) return console.error(err);
    var data = [];
    for (var i = 0; i < reports.length; i++) {
      console.log(reports[i]);
      data.push([reports[i].datetime, reports[i].reporter, reports[i].comment[0].getComment()]);
    }
    res.render('list_all', {
      title: 'Fault List',
      data: data
    });
  });
});

Хотя я уверен, что есть лучшие способы сделать это, по крайней мере, у меня есть ответна мой вопрос:)

Так как это было из-за комментария Нила Ланна, я бы хотел, чтобы он получил кредит, но я не уверен в этикете здесь.Должен ли я принять свой собственный ответ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...