You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:30:49