如何在 Mongoose 中准确获取文档数量并用于自增 ID 生成
发布时间 - 2026-01-07 00:00:00 点击率:次本文介绍如何正确使用 mongoose 获取集合中文档总数,避免因误用 `findone()` 导致 `nan` 错误,并安全实现基于计数的自增 id 逻辑。
在构建类似“猜 Emoji”这类需要唯一序号标识(如 ID: 1, 2, 3...)的应用时,一个常见误区是试图通过 model.findOne() 获取文档后直接调用 .length 属性来统计数量——但 findOne() 返回的是单个文档对象(或 null),而非数组,因此 data.length 恒为 undefined,参与数学运算后即得 NaN。
✅ 正确做法是使用 Mongoose 提供的聚合计数方法:
// ✅ 推荐:高效、原子性好、支持条件过滤
const count = await model.countDocuments();
// 创建新文档,ID 为现有总数 + 1
await model.create({ ID: count + 1, /* 其他字段 */ });⚠️ 注意事项:
- countDocuments() 是 Mongoose 5.3+ 推荐的替代方案(取代已弃用的 count()),它基于 $collStats 或 count 命令,准确且兼容分片集群;
- 若需带条件统计(例如仅统计未删除的记录),可传入查询对象:countDocuments({ deleted: false });
- 避免竞态条件(Race Condition):在高并发场景下,countDocuments() + create() 两步操作非原子性,可能导致重复 ID。如需强一致性,建议改用 MongoDB 原生 ObjectId、$inc 自增字段(配合单独计数器集合),或使用事务封装。
? 补充:若你确实需要「严格递增且不跳号」的整数 ID,推荐建立专用计数器集合(如 counters),配合 findOneAndUpdate 实现原子自增:
const counter = await db.collection('counters').findOneAndUpdate(
{ _id: 'emojiId' },
{ $inc: { seq: 1 } },
{ upsert: true, returnDocument: 'after' }
);
await model.create({ ID: counter.seq, emoji: '?', ... });总之,用对 API 是基础:findOne() 查数据,countDocuments() 数数量——二者语义与返回值截然不同,切勿混用。
# go
# mongodb
# ai
# NULL
# count
# 封装
# Length
# 并发
# undefined
# 对象
# 文档
# 的是
# 这类
# 而非
# 如需
# 两步
# 截然不同
# 性好
# 若你
# 返回值
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
清除minerd进程的简单方法
Laravel如何与Inertia.js和Vue/React构建现代单页应用
Swift中循环语句中的转移语句 break 和 continue
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
如何为不同团队 ID 动态生成多个非值班状态按钮
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
制作企业网站建设方案,怎样建设一个公司网站?
实例解析angularjs的filter过滤器
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
如何在Tomcat中配置并部署网站项目?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Bootstrap CSS布局之列表
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何在云主机快速搭建网站站点?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
如何在VPS电脑上快速搭建网站?
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何在景安服务器上快速搭建个人网站?
黑客如何利用漏洞与弱口令入侵网站服务器?
如何选择可靠的免备案建站服务器?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
详解Android——蓝牙技术 带你实现终端间数据传输
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何实现建站之星域名转发设置?
微信小程序 input输入框控件详解及实例(多种示例)
Laravel怎么使用Intervention Image库处理图片上传和缩放
Laravel如何配置Horizon来管理队列?(安装和使用)
如何在 React 中条件性地遍历数组并渲染元素
图册素材网站设计制作软件,图册的导出方式有几种?
如何用PHP工具快速搭建高效网站?
如何生成腾讯云建站专用兑换码?
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】

