MongoDB如何实现数值自增?findOneAndUpdate后打印debug返回undefined
问题原因
控制台打印undefined是多个写法错误导致的:
- 没有接收数据库操作的返回值,代码里的
data变量从未定义,对不存在的变量调用map方法自然返回undefined;另外还存在变量拼写错误,后续打印的变量名写为dubug,和常规命名不一致。 findOneAndUpdate参数写法错误:第一个参数是查询匹配条件,你把PostAmount: 1写进了查询条件,完全没有配置更新逻辑,既无法匹配到正确数据,也根本不会执行数值修改。- 数据库操作是异步逻辑,没有加
await等待操作执行完成就去取值,哪怕逻辑写对也会拿到空值。 - 额外逻辑错误:
findOneAndUpdate是单文档操作,返回值是单个匹配的文档对象,不是数组,根本不需要调用map做遍历。
正确实现方式
要实现发帖数自增,直接用MongoDB提供的$inc原子自增操作符即可,不需要先查值再手动修改,并发场景下也不会出现计数不准的问题。
- 修正
findOneAndUpdate的参数:第一个参数只传用户ID作为匹配条件,第二个参数用$inc指定PostAmount每次加1,加上配置项new: true返回更新后的文档,upsert: true兼容首次发帖的用户(无记录时自动创建,首次自增后PostAmount为1,不需要提前插入初始值为0的记录) - 加
await接收数据库返回的更新后文档 - 直接从返回的文档中取PostAmount打印即可,去掉多余的map逻辑
修复后的对应代码
替换原代码中数据库操作和打印的部分即可,前面发嵌入消息、加反应的逻辑无需改动:
const updatedUserData = await db.findOneAndUpdate( { UserId: userId }, { $inc: { PostAmount: 1 } }, { new: true, upsert: true } ) console.log(`当前用户累计发帖数:${updatedUserData.PostAmount}`)
内容的提问来源于stack exchange,提问作者Abel
相关产品推荐
相关产品推荐

