node.js - Mongoose 加载、限制和跳过两个集合中的数据
问题描述
我正在构建一个 MERN 堆栈社交媒体应用程序。在应用程序上,用户可以拥有一个带有帖子的个人资料,可以是照片或视频。
我的照片存储在帖子集合中,但是,视频存储在名为 media 的集合中。
当用户想要查看他们的帖子时,我有一个函数可以从两个集合中获取所有数据,按创建日期对它们进行排序并将它们返回到前端。在用户建立大量照片/视频之前,这一直运行良好,现在 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)
})
})
}
任何投入将不胜感激。
谢谢
解决方案
推荐阅读
- php - 基于 Web 数据更改的 Android 应用程序即时通知
- docker - 如何将自定义 docker 映像与 Azure Databricks 一起使用
- javascript - 与其他 GLTF 查看器相比,Javascript Three.Js GLTF 加载非常慢
- postgresql - postgresql表中的累积和
- python - 从 HTTP/2 数据包中提取 Pyshark 标头“流 ID”信息
- firebase - Firebase firestore查询两个输入整数/字符串
- linux - 将路径列表可视化为树的方法?
- html - 如何设置具有双向绑定以及模板驱动表单验证的 Angular2 模板驱动表单元素
- google-apps-script - 将找到的数据带入消息框
- javascript - “react-standalone-form”不起作用