Ссылки на ObjectId модели Mongoose не работают

Я работаю с моделями и образцами Mongoose. Я использовал код с веб-сайта мангуста, где говорится о методе заполнения и ссылках. Я пытаюсь сохранить соответствующие идентификаторы "ссылочных" в обеих моделях. Это только сохранение идентификаторов ссылок в сюжетной модели. Вот код:

Обновление: добавлены схемы вверху, чтобы помочь:

    var personSchema = Schema({
      _id: Schema.Types.ObjectId,
      name: String,
      age: Number,
      stories: [{ type: Schema.Types.ObjectId, ref: 'Story' }]
    });

    var storySchema = Schema({
      author: { type: Schema.Types.ObjectId, ref: 'Person' },
      title: String,
      fans: [{ type: Schema.Types.ObjectId, ref: 'Person' }]
    });

    var Story = mongoose.model('Story', storySchema);
    var Person = mongoose.model('Person', personSchema);

(конец схем)

var author = new Person({
  _id: new mongoose.Types.ObjectId(),
  name: 'Ian Fleming',
  age: 50
});

author.save(function (err) {
  if (err) return handleError(err);

  var story1 = new Story({
    title: 'Casino Royale',
    author: author._id    // assign the _id from the person
  });

  story1.save(function (err) {
    if (err) return handleError(err);
    // thats it!
  });
});

Когда вы запускаете этот код, он генерирует это в mongo:

  db.people.find()
  { "_id" : ObjectId("5be0a37f1dd61a343115e2c8"), "stories" : [ ], "name" : "Ian Fleming", "age" : 50, "__v" : 0 }
  db.stories.find()
  { "_id" : ObjectId("5be0a37f1dd61a343115e2c9"), "title" : "Casino Royale", "author" : ObjectId("5be0a37f1dd61a343115e2c8"), "__v" : 0 }

Похоже, что он не хранит никаких идентификаторов в коллекции людей в «историях». Разве вы не хотели бы сохранить идентификаторы историй в коллекции людей?

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

 var author = new Person({
  _id: new mongoose.Types.ObjectId(),
  name: 'Ian Fleming',
  age: 50
 });

  var story1 = new Story({
    _id: new mongoose.Types.ObjectId(),
    title: 'Casino Royale',
    author: author._id    // assign the _id from the person
  });

  author.stories = story1._id;

  author.save(function (err) {
  if (err) return handleError(err);

  story1.save(function (err) {
    if (err) return handleError(err);
    // thats it!
  });

Это дает мне неопределенного автора.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 708
1

Ответы 1

Mongo не будет автоматически добавлять в поле Person "stories" только потому, что вы добавили объект Story.

В любом случае вам действительно не нужно хранить идентификаторы историй в объектах Person, так как вы всегда можете получить список историй от автора с помощью

db.stories.find({author: <id>})

Хранение в обоих местах создаст избыточную информацию, и вам нужно будет выбрать одно, чтобы быть правдой в случае несоответствия. Мне кажется, лучше не дублировать.

ОБНОВИТЬ:

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

db.persons.find({_id: <id>}).populate('stories')

Не использовал лично, но выглядит очень удобно.

Документы Mongoose для заполнения: https://mongoosejs.com/docs/populate.html

В этом есть смысл ... они действительно включают свойство "stories" в схему Person. Интересно, это просто для справки (без каламбура) и в данном конкретном случае это вообще не нужно. Я добавлю их схему к вопросу.

seoandcode 05.11.2018 23:37

Возможно, здесь объясняется, что делают «они»: stackoverflow.com/questions/18001478/…

Jim B. 06.11.2018 02:23

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