猫鼬加载,限制和跳过两个集合中的数据

问题描述 投票:0回答:1

我正在构建MERN堆栈社交媒体应用程序。在该应用程序上,用户可以拥有一个配置文件,其中包含可以是照片或视频的帖子。

我的照片存储在帖子集合中,但是视频存储在名为媒体的集合中。

[当用户想查看其帖子时,我有一个函数可以从这两个集合中获取所有数据,并按其创建日期对其进行排序,然后将其返回到前端。在用户创建大量照片/视频之前,这种方法一直运行良好,现在MongoDB将不再允许该用户发出请求,因为它占用了过多的RAM。

我想对此进行延迟加载,因此我不需要用户甚至不需要的所有数据,而且我知道如何使用单个集合来进行此操作,但是,我不确定如何当使用两个集合时,我会去做。

我知道我会一次将每个集合限制为2个对象,并向每个对象添加一个跳转以请求下两个对象,但是我不知道如何跟踪接下来需要哪个对象(照片或视频) ?

我当前的代码:

//First function, called by route
const listPostAndMediaByUser = (req, res) => {
  sortMediaAndPosts(req)
    .then(function(postsAndMedia) {
      return res.json(postsAndMedia);
    })
    .catch(function(error) {
      console.log("Error getting posts", error)
      return res.status(400).json({
        error: errorHandler.getErrorMessage(error)
      });
    });
};

//Sorting function
//This function runs getPosts, and getMedia
//And sorts them by their creation date
const sortMediaAndPosts = function(req) {
  return new Promise(async function(resolve, reject) {
    let postsAndMedia = [];
    try {
      const posts = await getPosts(req);
      const media = await getMedia(req);
      postsAndMedia = [...posts, ...media].sort(
        (a, b) => new Date(b.created) - new Date(a.created)
      );
    } catch (error) {
      console.log('Error: ', error);
      reject(error);
    }
    resolve(postsAndMedia);
  });
};

//Get posts function
const getPosts = function(req) {
  return new Promise(async function(resolve, reject) {
    try {
      Post.find({ postedBy: req.profile._id })
        .limit(2)
        .select('-photo')
        .populate('postedBy', '_id name')
        .populate('comments.postedBy', '_id name')
        .sort('-created')
        .exec((err, posts) => {
          if (err) reject(err);
          else resolve(posts);
        });
    } catch(e) {
      console.log('error!', e)
      reject(e);
    }
  });
};

//Get Media function
const getMedia = function (req) {
  return new Promise(async function(resolve, reject) {
    Media.find({postedBy: req.profile._id})
    .limit(2)
    .populate('postedBy', '_id name')
    .populate('comments.postedBy', '_id name')
    .sort('-created')
    .exec((err, media) => {
      if(err) reject(err)
      else resolve(media)
    })
  })
}

任何输入将不胜感激。

谢谢

node.js mongodb express mongoose
1个回答
0
投票

您的邮政和媒体架构看起来非常相似。您应该考虑将它们合并为一个架构。这样可以解决您的问题。

如果您不想更改架构,则应查看mongodb aggregation pipeline,它可让您联接来自多个集合的数据(使用$lookup)。

© www.soinside.com 2019 - 2024. All rights reserved.