Связывание 2 пн goose коллекций - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь создать простой сайт, где аутентифицированные пользователи (авторы) могут писать и публиковать истории. У меня есть коллекция Author и коллекция Story, и я пытаюсь создать связи между обеими коллекциями. Я использую mon goose и метод populate / ref. Я могу успешно отобразить историю или список историй, которые содержат информацию об их авторе, но я действительно пытаюсь прикрепить список историй к их автору при отображении профиля автора. Я хочу, чтобы при посещении страницы профиля автора пользователи могли видеть список своих историй.

Я пытаюсь использовать метод populate / ref для выполнения массива, в котором будут отображаться авторы. список историй (storyList), но массив остается неутомимо пустым. При отображении страницы профиля автора я сначала использовал функцию findById, но понял, что она не работает с заполнением. Поэтому я сейчас использую функцию findOne, но с теми же результатами.

Вот моя коллекция авторов:

const mongoose = require('mongoose');

const authorSchema = mongoose.Schema({
  userName: {
    type: String,
    required: true
  },
  firstName: String,
  lastName: String,
  authorImage: {
    type: String
  },
  emailAddress: {
    type: String,
    required: true,
    unique: true,
    match: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  },
  password: {
    type: String,
    required: true
  },
  storyList: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Story'
  }]
});

module.exports = mongoose.model('Author', authorSchema, 'authors');

Вот мой маршрут для отображения страницы профиля автора:

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');

const Author = require('../models/author');

exports.authors_get_one = (req, res, next) => {
  const username = req.params.userName;
  Author.findOne(username)
    .select("_id userName firstName lastName emailAddress password authorImage storyList")
    .populate('storyList')
    .exec()
    .then(doc => {
      console.log("From database", doc);
      if (doc) {
        res.status(200).json({
          author: doc,
        });
      } else {
        res.status(404).json({
          message: 'No valid entry found for provided ID'
        });
      }
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
}

Вот моя схема истории

const mongoose = require('mongoose');

const storySchema = mongoose.Schema({
  author: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Author',
  },
  title: {
    type: String,
  },
  text: {
    type: String,
  },
  language: {
    type: String,
  },
  published: {
    type: Boolean,
    default: false
  }
});

module.exports = mongoose.model('Story', storySchema, 'stories');

А вот мой путь создания истории:

const mongoose = require('mongoose');
const Story = require('../models/story');
const Author = require('../models/author');

exports.stories_createOne = (req, res, next) => {
  const story = new Story({
    title: req.body.title,
    text: req.body.text,
    language: req.body.language,
    author: req.body.author
  });
  story
    .save()
    .then(result => {
      console.log(result);
      res.status(201).json({
        message: "Story publiée !",
        createdStory: {
          _id: result._id,
          title: result.title,
          text: result.text,
          language: result.language,
          author: result.author,
        }
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
}

Из найденной документации я не вижу, что Я делаю не так Я что-то здесь упускаю? Разве метод populate недостаточен для выполнения моего списка историй (storyList)? Должен ли я вообще что-то делать в моем коде и что?

1 Ответ

0 голосов
/ 12 февраля 2020

Причина, по которой ваш массив storyList остается пустым, заключается в том, что вы не помещаете ссылку на историю в массив author.storyList после создания историй. Источник .

Простым решением этой проблемы было бы сделать что-то подобное в маршруте для создания истории:

exports.stories_createOne = (req, res, next) => {
  const story = new Story({
    title: req.body.title,
    text: req.body.text,
    language: req.body.language,
    author: req.body.author
  });
  story
    .save()
    .then(result => {
      console.log(result);
      // Push the story id into the author.storyList array
      Author
        .update(
          { _id: req.body.author }, 
          { $push: { storyList: result.toJSON()._id } }
         )
        .then(() => {
          // send response here
        })
    })
    .catch(err => {
      // Handle Error
    });
}
...