【问题标题】:Mongoose deleteOne, findOneAndDelete, findOneAndRemove not working猫鼬 deleteOne、findOneAndDelete、findOneAndRemove 不起作用
【发布时间】:2020-07-07 21:29:03
【问题描述】:

我尝试了以下代码(其他类似的功能也是如此),它最初确实有效,但后来却无效。有一个具有匹配 id 的项目,这没有给出任何错误并执行,但文档没有从 MongoDB 中删除

CompanyModel.findOneAndDelete({ id: data.id }, function (err, doc) {
  if (err) {
    console.error(err);
  }
});

【问题讨论】:

  • 能否请您提供至少一条来自您的数据库的记录,并带有相应的 ID?
  • 如果确实有匹配的条目可以工作,那么最可能的解释是您没有执行您认为的搜索,或者实际上没有匹配的条目。 findOne() 是否返回相同搜索对象的值?是否发生了其他一些使问题混淆的异步事件?
  • 我发现了问题。这是由于文档不可用,因为它是在删除后创建的,因为我在 process.nextTick 函数中使用了 model.save。

标签: javascript node.js mongoose


【解决方案1】:

mongo id 为_id,比较值应转换为 ObjectId :

// import { ObjectId } from 'bson';

{_id: new ObjectId(id)}

如果您不想使用_id,您必须确保 id 字段存在并且它包含值(具有正确的类型)。否则请求似乎很好。

【讨论】:

  • 我觉得没必要转成ObjectId。它应该适用于data.id
  • 是的 id 字段具有正确的值,即使我对其进行硬编码,结果也是相同的。它最初有效,后来失败了。
  • @DuminduDharmawardhana 直接对数据库进行查询是否有效? (例如:doc.find({ 'id' : 'someValue' })
【解决方案2】:

您需要在过滤器中提供_id: data.id。 例如。

CompanyModel.findOneAndDelete({ _id: data.id }, function (err, doc) { 
    //code here 
}

【讨论】:

  • 我想要的是按 id 字段而不是 _id 过滤
【解决方案3】:

我在发布问题后发现了一点。问题是,我正在运行一个测试,在我的 socket-io 客户端中创建文档和删除它一个接一个地发生,但我使用“process.nextTick”函数将模型保存在服务器端,但不用于删除。所以删除发生在创建之前。我预计这种情况会给出错误,但如果找不到项目,它不会给出任何错误。

我很困惑,因为我发现 Model.deleteOne 不再受支持 Mongoose.js - TypeError: Model.deleteOne is not a function

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 2018-11-09
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2014-12-19
    • 2022-01-05
    • 2015-11-16
    相关资源
    最近更新 更多