MongoDB deleteOne()返回deletedCount:0问题排查求助
MongoDB deleteOne() 执行后 deletedCount 始终为 0 问题排查
我用Node.js Express写了/deleteLast接口,通过POSTMAN发送DELETE请求后,MongoDB的deleteOne()方法返回{"acknowledged": true,"deletedCount": 0},完全删不掉数据。
代码实现
app.delete('/deleteLast', (req,res)=>{ let newDate= new Date; stick.find({Day: deCostruct(newDate).Day}) .then((data)=>{ let closest; closest=findClosestTime(data); sticks.deleteOne({Time: closest }) .then((response)=>{ res.send(response); }) .catch((err)=>{ console.log(err); }); console.log("closest time var: "+closest); }) .catch((err)=>{ console.log(err) }); })
代码逻辑
获取当前日期,查找当日数据,调用findClosestTime拿到最近的时间,再按Time字段执行删除操作。试过通过_id删除,结果还是deletedCount:0。
数据库情况
- 结构:
Day为字符串类型,Time为字符串类型(格式如"10:24"),包含MongoDB默认的_id字段 - 数据:存在多条
Day匹配当前日期、Time为不同时分格式的记录
问题排查及解决办法
- 集合名称不匹配:代码里查询用的是
stick集合,删除时用的是sticks(多了个s)!MongoDB集合名称严格区分且完全匹配,两个不是同一个集合,肯定删不到数据。把sticks.deleteOne改成stick.deleteOne就能解决。 - 时间格式不匹配:检查
findClosestTime返回的closest值,和数据库里Time字段的格式是否完全一致——比如有没有多余空格、大小写差异(虽然示例里是数字冒号,但要确认)。可以打印typeof closest和数据库中Time的类型,确保都是字符串且内容完全相同。 - 日期格式不匹配:确认
deCostruct(newDate).Day返回的日期字符串,和数据库里Day的格式完全一致。比如数据库存的是"2024-05-20",你返回的要是"2024/05/20",那stick.find根本拿不到数据,后续删除自然找不到目标。 _id删除失败的处理:如果用_id删也失败,大概率是你传的_id是普通字符串,不是MongoDB的ObjectId类型。需要把字符串转换成ObjectId再执行删除:const { ObjectId } = require('mongodb'); // 假设拿到的_id字符串是idStr stick.deleteOne({ _id: ObjectId(idStr) })
内容的提问来源于stack exchange,提问作者Oleg Cherenkov
相关产品推荐
相关产品推荐

