Направляйте пользовательские данные в коллекцию постов, используя Mongoose - PullRequest
0 голосов
/ 06 февраля 2019

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

Вот модель пользователя

var UserSchema = new mongoose.Schema({
    username: {
        type: String,
        index: true
    },
    password: {
        type: String
    }, 
    email: {
        type: String
    },
    name: {
        type: String
    },
    profileimage: {
        type: String
    },
    uposts: [{ type: Schema.Types.ObjectId, ref: 'Post'}]
});

var User = module.exports = mongoose.model('User', UserSchema);

Вот модель почты

var PostSchema = new mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    postimage: {
        type: String
    },
    author: {
            type: Schema.Types.ObjectId,
            ref: "User"
        // username: String
    },

});

var Post = module.exports = mongoose.model('Post', PostSchema);

Маршрут для добавления нового сообщения

router.post('/add', upload.single('postimage'), (req, res, next) => {
    if(req.file) {
        console.log('Uploading File..');
        var postimage = req.file.filename;
        } else {
        console.log('No File Uploaded');
        var postimage = 'noimage.jpg';
    }

    var newPost = new Post({
        postimage: postimage
      });

      Post.createPost(newPost, (err, post) => {
        if(err) throw err;
         console.log(post);
      });

  req.flash('success', 'Successfully Created Posts');

  res.location('/');
  res.redirect('/');

});

Маршрутизатор для отображения сообщений

router.get('/view', ensureAuthenticated,  (req, res, next) => {
    // res.render('viewpost', { user: req.user });
    Post.find({_id: {$ne: req.user._id}}, (err, posts) => {
        if(err) {
          console.log(err);
        } else {
          res.render('viewpost', {currentUser: req.user, posts: posts});
        }
    });
});

Также мне нужно отобразитьподробности публикации других пользователей, кроме зарегистрированного пользователя.Было бы очень полезно, если бы вы могли предоставить подходящий метод для того же.

1 Ответ

0 голосов
/ 07 февраля 2019

Перед Приложением, пожалуйста, проверьте версию mongoDB,

router.get('/view', ensureAuthenticated,  async(req, res, next) => {
  try {
    const posts = await Post.aggregate([
      { 
       $match: { userId: { $ne: req.user._id }}
      },
      {
        $lookup: {
          from: "users",
          localField: "userId",
          foreignField: "_id",
          as: "user"
        }
      },{
        $project: {
          postimage: "$postimage",
          user: { $arrayElemAt: ["$user", 0] }
        }
      }
    ])
   res.render('viewpost', {currentUser: req.user, posts: posts, error: ''});
  } catch(error) {
    res.render('viewpost', { currentUser: req.user, posts: [], error: error});
  }
})

Если результат не найден, укажите req.user._id как ObjectId , используя mongoose.Types.ObjectId (req.user._id)

...