Хранение и возврат ObjectId в MongoDB (MEAN Stack)

Я новичок в стеке MEAN, и у меня возникли проблемы с тем, как правильно связать ObjectId с MongoDB из моего JavaScript. Я также пытаюсь затем получить имя, которое соответствует этому ObjectId, чтобы показать в моем представлении.

Код предназначен для назначения встреч в расписании, где пользователи привязаны к каждому собранию, а затем в представлении отображается информация о каждом собеседовании (т. Е. Имя каждого пользователя).

Вот моя схема для расписания:

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var ScheduleSchema = new Schema({
  description: String,
  category: [String],
  location: String,
  startDate: { type: Date, default: Date.now },
  endDate: { type: Date, default: Date.now },
  participants: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }],
  author: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  timestamp: { type: Date, default: Date.now },
  active: Boolean
});

module.exports = mongoose.model('Schedule', ScheduleSchema);

И схема для пользователей:

var UserSchema = new Schema({
  name: String,
  email: { type: String, lowercase: true },
  role: {
    type: String,
    default: 'user'
  },
  hashedPassword: String,
  provider: String,
  salt: String
});

В этом файле есть намного больше, но я думаю, что схема является единственной важной частью.

А вот мой код контроллера, который передает ложную информацию о тестировании с двумя объектами реального пользователя (участниками):

// Use our rest api to post a new meeting
$scope.addMeeting = function() {
  $http.post('/api/schedules', { description: "Testing schedule adding", participants: ["547f03befccbd4f93874b547", "5481dcbf5dad7f735a766ad9"], category: "1", location: "Small Conference Room", startDate: new Date(), endDate: new Date(), timestamp: new Date(), active: true });
};

Я получил это, чтобы опубликовать хорошо, но когда я получаю все встречи из расписания и помещаю их в представление, (возможно, очевидно), ObjectId отображается, а не имя, так что это:

<table style="width:100%;">
  <tr>
    <td class="left" ng-class="'head'">Time</td>
    <td ng-class="'head'">Attendees</td>
    <td ng-class="'head'">Description</td>
    <td class="right" ng-class="'head'">Location</td>
  </tr>
    <tr ng-repeat="meeting in meetings">
      <td class="left" ng-class-even="'even'">{{ meeting.startDate | date:"h:mma" }} - {{ meeting.endDate | date:"h:mma" }}</td>
      <td ng-class-even="'even'"><span ng-repeat="person in meeting.participants">{{ person }}<span ng-hide="$last">, </span></span></td>
      <td ng-class-even="'even'">{{ meeting.description }}</td>
      <td class="right" ng-class-even="'even'">{{ meeting.location }}</td>
    </tr>
</table>

Обратимся к этому: (у меня было опубликовано изображение, но у меня недостаточно очков репутации, поэтому все, что было показано на картинке, это ObjectIds пользователей под колонкой "Участники" вместо имен)

И мне интересно, как вы должны правильно связать вещи, чтобы иметь возможность показывать имя вместо этих ObjectIds.

Извините за роман, надеюсь, я приложу достаточно, чтобы прояснить его.

1 ответ

Поскольку вы используете Mongoose, используйте populate загрузить отношения. В MongoDB вы храните user._id в schedule.participants, поэтому, когда вы перечисляете свои расписания или запрашиваете точное расписание, убедитесь, что вы заполнили schedule.participants массив.

http://mongoosejs.com/docs/populate.html

пример

Schedule
.findOne({ title: 'Once upon a timex.' })
.populate('participants')
.exec(function (err, story) {
if (err) return handleError(err);
  console.log('The creator is %s', story._creator.name);
  // prints "The creator is Aaron"
})

Также угловой код должен привязываться к имени или электронной почте пользователя по мере необходимости.{{ person.name }}

Другие вопросы по тегам