0

0

怎么设计MongoDB的浏览足迹_有限容量数组与固定集合Capped Collection

P粉602998670

P粉602998670

发布时间:2026-03-17 02:15:34

|

862人浏览过

|

来源于php中文网

原创

应优先使用 $push 与 $slice 组合维护用户足迹数组,原子性保证最新 N 条;避免先 push 再 pop 或应用层截断;Capped Collection 不适用于用户级足迹,因其不支持按用户隔离且缺乏查询灵活性;高频写入需警惕文档迁移导致的碎片与写放大;时间范围查询应改用独立集合 + 复合索引 + TTL。

怎么设计mongodb的浏览足迹_有限容量数组与固定集合capped collection

$push + $slice 维护用户足迹数组,别硬塞满再删

MongoDB 里存最近 N 条浏览记录,最常见做法是字段设为数组,每次用 $push 加新记录,同时用 $slice 限制长度。这不是“模拟栈”,而是原子级裁剪——写入和截断一步完成,不会出现中间态超长。

常见错误是先 $push$pull$pop,结果并发写入时漏删、重复删、甚至把整个数组清空。也有人想用应用层判断长度再决定是否删老数据,这既慢又不一致。

  • db.users.updateOne({ _id: userId }, { $push: { history: { $each: [newRecord], $slice: -50 } } }) —— 保留最新 50 条,负数表示从尾部截取
  • 注意 $slice 必须和 $each 同级,单独写 $push: { history: newRecord } 再加 $slice 无效
  • 数组字段必须已存在(哪怕为空数组),否则首次插入会失败;建模时建议初始化 history: []

别用 Capped Collection 存用户级足迹,它不支持按用户隔离

Capped Collection 看似“自动淘汰旧数据”,但它是整个集合级别 FIFO,所有文档共用一个写入顺序。你没法让张三的足迹只影响张三的容量,李四的操作可能把张三刚写的记录顶掉——这不是“用户足迹”,这是“全站乱序日志池”。

除非你在做全站最近 10 万次访问快照(且不要求归属到具体用户),否则 Capped Collection 在足迹场景下是误用。它连 find() 都不能带复杂查询条件,sort()skip() 效率极差,还禁用 $set 更新已有文档。

  • Capped Collection 的 size 是字节上限,不是文档数上限;文档大小波动大会导致实际条数不稳定
  • 无法创建二级索引(除 _id 外),查某用户最近 10 条得全表扫
  • 一旦集合满,新插入直接覆盖最老文档,且无任何回调或通知机制

当足迹要查时间范围或带筛选条件时,数组方案立刻变重

如果只是展示“最近看过什么”,数组 + $slice 足够。但一旦要查“昨天看过的商品”“3 天内未重复的类目”,数组就扛不住了:MongoDB 无法高效在数组子元素上建带时间范围的复合索引,$elemMatch 只能加速存在性判断,对范围查询帮助有限。

VALL-E
VALL-E

VALL-E是一种用于文本到语音生成 (TTS) 的语言建模方法

下载

这时该切回普通集合,用 userId + timestamp 建复合索引,并配合 TTL 索引自动过期(比 Capped 更可控)。

  • db.user_history.createIndex({ userId: 1, timestamp: -1 }, { name: "user_time" }) 支持按用户+时间倒序分页
  • db.user_history.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 }) 让 MongoDB 自动删过期文档
  • TTL 删除是后台线程异步执行,延迟通常在 60 秒内,比手动定时任务更轻量

数组方案的隐含成本:文档增长与 WiredTiger 页面分裂

每次 $push + $slice 都是原地更新(in-place update),但如果数组扩容后超出原存储页大小,WiredTiger 会触发文档迁移——复制整份数据到新位置,旧空间标记为可复用。高频足迹写入下,这会导致写放大和碎片。

实测中,单文档超过 4MB(MongoDB 文档上限)不是问题,但频繁迁移会让 oplog 增大、副本同步延迟上升,尤其在副本集 secondary 节点资源紧张时。

  • 预估单条足迹平均 200 字节,50 条约 10KB,安全;但若混入截图 base64 或完整 referer,单条破 KB 就得警惕
  • 避免在足迹数组里存冗余字段,比如重复存 userName;只留必要 ID 和时间戳,详情走关联查询
  • 如果发现 db.collection.stats().wiredTiger.block-manager.fileSize 明显大于 dataSize,说明碎片已高
实际选型没那么多纠结:用户维度、需归属、要查时间——用独立集合 + TTL;纯前端快速展示最近几条——数组 + $slice;Capped 只留给审计日志、埋点缓冲这类不要求语义、只要顺序的场景。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

410

2023.09.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mongodb启动命令
mongodb启动命令

MongoDB 是一种开源的、基于文档的 NoSQL 数据库管理系统。本专题提供mongodb启动命令的文章,希望可以帮到大家。

267

2023.08.08

MongoDB删除数据的方法
MongoDB删除数据的方法

MongoDB删除数据的方法有删除集合中的文档、删除整个集合、删除数据库和删除指定字段等。本专题为大家提供MongoDB相关的文章、下载、课程内容,供大家免费下载体验。

161

2023.09.19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1010

2023.11.02

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号