2024年新版MongoDB批量删除之传入id数组批量删除,body传参正确,还是报错?错在这里没跑了~

先说结论

因为我安装的这个版本的MongoDB默认存储的id是一个ObjectId类型,如果只把body传过来的字符串id传给数据库是不行的,控制台会报错,而且会卡死,不重启其他的请求也GG,真可恨啊,足足调了将近一个小时,我哭死,必须必须必须进行类型转换。

可以去compass里面验证一下,_id的类型

node例子

下面是基于node环境下使用mongoose进行批量删除的例子

在Mongoose中,如果你想根据一个ID数组删除多个文档,你可以使用`deleteMany()`方法配合`_id`和`$in`操作符。下面是一个示例代码片段,展示了如何实现这一操作:

const mongoose = require('mongoose');
const ObjectId = mongoose.Types.ObjectId;

// 假设你有一个名为MyModel的模型
const MyModel = mongoose.model('MyModel');

// 这是一个包含你要删除的文档_id的数组
const idsToDelete = ['6439abc1234567890abcdef0', '6439abc1234567890abcdef1'];

// 将字符串ID转换为ObjectId,因为Mongoose需要ObjectId类型
const objectIds = idsToDelete.map(id => new ObjectId(id));

// 使用$in操作符匹配_id在数组中的所有文档并删除它们
MyModel.deleteMany({_id: {$in: objectIds}})
  .then(result => {
    console.log(`成功删除了${result.deletedCount}个文档`);
  })
  .catch(err => {
    console.error('删除文档时出错:', err);
  });

首先导入mongoose模块,并获取ObjectId构造函数,用于将字符串id转换为MongoDB能够识别的ObjectId类型。然后,定义一个包含待删除文档id的数组,并使用map函数将每个id转换成ObjectId对象。最后,调用`MyModel.deleteMany()`方法,传入一个查询条件对象,其中 _id 字段使用 $in 操作符匹配数组中的任何一个id,从而实现根据id数组删除多个文档的目的。

多一嘴

但是其实使用mongoose的话,你如果只删除一个,就是不批量删除,可以不用进行类型转换,系统默认转换,这也是大多数教程里的删除的做法,使用的是deleteOne这个api。

不得不再提一嘴,现在deleteMany不接受给第二个参数,之前好多教程里面都在第二个参数传入一个回调,现在新版的mongoose不行了,现在只需要.then就行了,这个点也卡了我不少时间,望周知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值