Мангуста Население в Узле JS / Экспресс JS - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь установить связь между двумя коллекциями мангустов.Таким образом, информация о пользователе сохраняется в коллекции с именем user, а его содержимое хранится в другой коллекции.Пока что я скопировал некоторый код из здесь и отредактировал его;

, а затем с помощью Postman я создал имя пользователя с именем "example";затем я создал пост со случайным контентом, и как автор я установил его «пример», но кажется, что он не работает, когда я получаю «/ test», он регистрирует:

ЗаполненоПользователь {posts: [], _id: 5c530cd4ede117109cf1a5e9,
username: 'example', __v: 0}

posts пуст, как вы видите, что я должен изменить, чтобы это исправить?

     const UserSchema = new mongoose.Schema({
      username: String,
      posts: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Post'
      }]
    })
  const PostSchema = new mongoose.Schema({
      content: String,
      author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
      }
    })

    function getUserWithPosts(username){
      return User.findOne({ username: username })
        .populate('posts').exec((err, posts) => {
          console.log("Populated User " + posts);
        })
    }

    const Post = mongoose.model('Post', PostSchema, 'posts');
    const User = mongoose.model('User', UserSchema, 'users');

  app.post('/testUser', (req, res) => {
    var username = req.body.username;
    var clientModel = new User({
      username: username,
    });
    clientModel.save(function (error) {
      if (error) {
        console.log(error);
      }
      res.send({
        success: true,
        username: username,
        message: 'account saved successfully!'
      });
    });
  });

  app.post('/testPost', (req, res) => {
    var content = req.body.content;
    var author = req.body.author;
    var clientModel = new Post({
      content: content,
      author: author
    });
    clientModel.save(function (error) {
      if (error) {
        console.log(error);
      }
      res.send({
        success: true,
        content: content,
        author: author,
        message: 'account saved successfully!'
      });
    });
  });



  app.get('/test', (req, res) => {
    res.send({
      posts: getUserWithPosts("example")
    })
  });

1 Ответ

0 голосов
/ 31 января 2019

РЕДАКТИРОВАТЬ

Я вижу, что здесь происходит сейчас.Похоже, у вас есть проблема циркулярных ссылок.Ваши user.posts ссылаются на сообщения, созданные пользователем.Posts.author ссылается на автора, который создал пост.Если вы хотите, чтобы эта работа работала, вам нужно будет зайти и обновить пользовательский объект после создания объекта post и передать post._id.

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

Модель пользователя

const UserSchema = new mongoose.Schema({
  username: String
})

UserSchema.virtual('posts', {
  ref: 'Post',
  localField: 'username',
  foreignField: 'author',
  justOne: false
});

Это создаст виртуальный, и всякий раз, когда вы найдете пользователя и позвоните .populate ('posts'), выполучит массив сообщений, созданных пользователем.

Подробнее о виртуалах mongoose можно узнать здесь: http://thecodebarbarian.com/mongoose-virtual-populate

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