我正在构建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)
})
})
}
任何输入将不胜感激。
谢谢
您的邮政和媒体架构看起来非常相似。您应该考虑将它们合并为一个架构。这样可以解决您的问题。
如果您不想更改架构,则应查看mongodb aggregation pipeline,它可让您联接来自多个集合的数据(使用$lookup)。