使用猫鼬节点删除许多$in文档时出错.js



我想根据_ids的传入(来自客户端(array删除记录。我的删除功能是这样的

export function removeReferral(ids) {
return new Promise((resolve, reject) => {
ReferralLink.findByIdAndRemove({ _id: { $in: (ids).map(mongoose.Types.ObjectId) } }, (err, link) => {
console.log('delete referrals response : ', link)
if (!err) {
resolve({
success: true,
message: "Referral removed successfully",
data: null
});
} else {
resolve({
success: false,
message: "Unable to remove referral",
data: err
});
}
});
});
}

但是我收到这样的错误

message: "Cast to ObjectId failed for value "{ _id: { '$in': [ 5e1f2e54d4252144ec17501a ] } }" at 
path "_id" for model "referralLinks""
name: "CastError"
stringValue: ""{ _id: { '$in': [ 5e1f2e54d4252144ec17501a ] } }""
kind: "ObjectId"

我该如何解决?

所以一般来说猫鼬findById*'s会接受单个_id作为过滤器,如果你在内部传递一个字符串,猫鼬会将字符串转换为_id,所以你不能将数组传递给它 - 如果要使用findByIdAndRemove- 你需要循环_id并进行多次数据库调用(删除每个文档(, 我也稍微改变了你的代码,为什么要检查!err?相反,您可以先检查if(err)然后检查以写入结果。试试这个:

试试这个:

export function removeReferral(ids) {
return new Promise((resolve, reject) => {
ReferralLink.deleteMany({ _id: { $in: (ids).map(mongoose.Types.ObjectId) } }, (err, link) => {
console.log('delete referrals response : ', link)
if (err) {
resolve({
success: false,
message: "Unable to remove referral",
data: err
});
} else if (link.n > 0) { /** Checking if atleast one _id in input array is removed,
Or if you need to check all are deleted then n == array.length */
resolve({
success: true,
message: "Referral removed successfully",
data: null
});
} else {
resolve({
success: true,
message: "Not able to remove Referrals successfully",
data: null
});
}
});
});
}

最新更新