使用Mongoose引用帖子收集中的用户数据

时间:2019-02-06 17:34:39

标签: node.js mongodb mongoose-schema mongoose-populate

我创建了登录和注册页面,并且用户数据存储在用户集合中。还提供了用于添加和查看登录用户创建的新帖子的功能。因此,无论何时用户创建帖子,我都需要在帖子集合中引用用户数据(用户名)。我已经检查了一些论坛,但无法理解填充方法。我需要了解在架构中引用数据以及如何从用户集合中获取数据并将其用于后期集合中。

这是用户模型

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 :(得分:0)

在申请之前,请检查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});
  }
})

如果未找到结果,请使用 mongoose.Types.ObjectId(req.user._id)

将req.user._id设置为 ObjectId