当前位置:   article > 正文

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

mongod compass批量删除

先说结论

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

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

node例子

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

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

  1. const mongoose = require('mongoose');
  2. const ObjectId = mongoose.Types.ObjectId;
  3. // 假设你有一个名为MyModel的模型
  4. const MyModel = mongoose.model('MyModel');
  5. // 这是一个包含你要删除的文档_id的数组
  6. const idsToDelete = ['6439abc1234567890abcdef0', '6439abc1234567890abcdef1'];
  7. // 将字符串ID转换为ObjectId,因为Mongoose需要ObjectId类型
  8. const objectIds = idsToDelete.map(id => new ObjectId(id));
  9. // 使用$in操作符匹配_id在数组中的所有文档并删除它们
  10. MyModel.deleteMany({_id: {$in: objectIds}})
  11.   .then(result => {
  12.     console.log(`成功删除了${result.deletedCount}个文档`);
  13.   })
  14.   .catch(err => {
  15.     console.error('删除文档时出错:', err);
  16.   });

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

多一嘴

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号