Nodejs mongoose 批量删除 出错

Nodejs mongoose 批量删除 出错

Role.remove({"_id":{$in:idArr}},function(err,doc){ 。。。 }) 错误: Error: key $in must not start with ‘$’

请问应如何批量删除??

4 回复

Node.js Mongoose 批量删除出错问题

问题描述

在使用Mongoose进行批量删除时,遇到了一个错误:“Error: key $in must not start with ‘$’”。这通常是因为查询条件的格式不正确。

解决方案

正确的做法是确保查询条件符合Mongoose的语法。在你的例子中,idArr 是一个包含多个 _id 的数组,因此应该使用 $in 操作符来匹配这些 _id。但是,错误提示说明了问题出在 $in 关键字的使用上。

下面是修正后的代码示例:

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

// 示例 idArr
const idArr = ['5f9c8b2a3e4d5f6c7d8e9f0', '5f9c8b2a3e4d5f6c7d8e9f1'];

Role.deleteMany({ _id: { $in: idArr } }, function(err, result) {
    if (err) {
        console.error("删除失败:", err);
        return;
    }
    console.log("删除成功:", result.deletedCount + "条记录被删除");
});

关键点解释

  • deleteMany 方法:这是用于批量删除文档的方法,相比 remove 方法更推荐使用,因为它返回的是删除的文档数量而不是整个结果对象。
  • $in 操作符:用于匹配数组中的任意一个值。在本例中,它用来匹配 _id 属于 idArr 数组中的任何元素。
  • 错误处理:在回调函数中检查是否有错误发生,并根据情况输出错误信息或成功信息。

通过这种方式,你可以避免之前遇到的错误,并正确地批量删除数据库中的文档。


在之前某个版本的时候好像遇到过类似的问题,后来好像就没有了,楼主尝试换个版本试下

恩 好的 谢谢!

根据你提供的错误信息,问题出在使用 $in 操作符时,Mongoose 不允许直接使用以 $ 开头的键名。你需要传递一个数组作为条件的一部分,而不是直接使用 $in 操作符。

以下是正确的代码示例:

const mongoose = require('mongoose');
const Role = mongoose.model('Role'); // 假设你的模型名为 Role

async function deleteRoles(ids) {
    try {
        const result = await Role.deleteMany({ _id: { $in: ids } });
        console.log(`Deleted ${result.deletedCount} documents`);
    } catch (err) {
        console.error("Error occurred while deleting roles:", err);
    }
}

// 调用函数并传入 id 数组
deleteRoles(['id1', 'id2', 'id3']);

解释:

  • deleteMany() 方法用于删除满足条件的多个文档。
  • { $in: ids } 是一个查询条件,表示 _id 字段需要在 ids 数组中。
  • await 关键字用于等待异步操作完成,并获取结果。
  • 如果删除成功,result.deletedCount 将显示已删除的文档数量。
  • 如果发生错误,将捕获异常并输出错误信息。

这样可以正确地批量删除指定 _id 的文档,避免了原始代码中的错误。

回到顶部