如何使10个项目的高性能选择或多或少,然后知道当前用户何时已经在mongodb中查看了该项目?[关闭]
-
21-12-2019 - |
题
我想在youtube上实现一个功能,你知道你看过哪些视频。
我必须解决:
- 将播放的视频存储在本地存储中,并使用此数据更新用户界面。(这将需要一个高的数据负载启动,如果数据不是已经在本地存储和用户已经看了很多视频)
- 将数据存储在一个表中,当然,在得到查询的结果后,获取与当前用户相关的每个视频信息。在我看来,这种方式需要太多的查询。
你可能会建议什么?
解决方案
将数据存储在一个表中,当然,在得到查询的结果后,获取与当前用户相关的每个视频信息。在我看来,这种方式需要太多的查询。
我不明白这需要很多查询,你只需要两个:一个"常规",一个使用 $in
:
假设 一个集合 videos { _id, title, description, uploader, date, ... }
和一个集合 userRecentVideos { userId, videoIds : [1, 912, 234234, ... ] }
,
这样就行了:
var recent = db.userRecentVideos.find({"userId" : myUserId})[0].videoIds;
var videoInfo = db.videos.find({"_id" : {$in : recent}});
或者,您可以公开一个 getVideoInfos
接受Id列表并返回视频元信息列表的HTTP端点。
该 videoIds
应该有一个固定的大小,应该初始化为所有0或其他东西,所以数组不会一直增长。
如果你真的想存储整个历史记录,最好不要使用嵌入式数组,而是让它成为一个链接器集合:
videoHistory { _id, userId, videoId }
放一个索引 {_id, userId}
, ,并且可以得到每个用户最近播放的n个视频,假设 _id
是对象id等单调键。
不隶属于 StackOverflow