mongodb 文档结构设计
需求: mongodb 记录用户搜索日志并提供用户和管理后台查询
query+qty 唯一
用户端需要展示一个这样的表格:
query (搜索型号) | qty (搜索数量) | weekly_search_times (最近 7 天搜索次数) | last_search_time (最近搜索时间) |
---|---|---|---|
型号 1 | 1 | 10 | 2022-10-13 00:00:00 |
型号 1 | 2 | 4 | 2022-10-18 00:00:00 |
型号 2 | 3 | 4 | 2022-10-18 01:00:00 |
开始是设计这样的结构,之前没怎么用过 mongo ,就用了这种扁平化的结构。
{
"_id": xxx,
"query": "xxx",
"user": 1,
"qty": 100
}
这种当然是最简单方便的,但是领导说不行,这样还不如用 mysql ,这样的化存储的数据量大,后期查询会慢。说要设计一种结构,最好是一个用户一个文档,这个文档除了放用户的搜索历史,后面还可能放一些其他日志类的数据。 但是一个 mongo 文档又有 16M 的大小限制,说是设置一个容量,如果最多存 1000 个搜索日志,超过了清除。于是就有了下面这种结构:
{
"_id": xxx,
"user": 1000,
"search_history": [{"query": "xxx", "time": 1660000, "qty": 1}]
}
这样子呢,相对上一种方法大大减少了文档数,一个用户一个文档,查询效率貌似变高了,因为只要查到一个文档就行,但是查询时无法直接对 search_history 进行过滤, 要把整个文档查询出来然后在内存中实现过滤(时间筛选)、分组( group by query+qty )、分页。 而且查询某个搜索词被哪些用户搜索过不方便实现。 所以这种方案不行。
搜索接口的访问量挺大的,所以是这个日志是写多读少的情况。
所以应该设计怎样的一个结构较为合理,各位大佬赐教。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.