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
的文档,避免了原始代码中的错误。