【问题标题】:How do I remove documents after search results using Node.js Mongoose?如何使用 Node.js Mongoose 在搜索结果后删除文档?
【发布时间】:2013-11-26 06:36:45
【问题描述】:
        AAAModel.find({'category' : category})
          .skip(100)
          .sort({date: 'desc'})
          .exec(function(err, result) {
          if (err) {
            next(err);
          }
          if (result) {
            result.remove();
          }
        });

上述方法不起作用。 我想删除 100 个或更多的搜索结果,我该怎么办?

【问题讨论】:

  • 你在使用猫鼬访问数据吗?
  • 是的。我选择猫鼬。

标签: node.js mongodb express mongoose database


【解决方案1】:

您可以尝试以下方法之一:

Model.findOne({_id: 'specific_id'}, (err, doc) => {
    doc.remove((err) => {
        if (err) // handle err
    });
    // or simply use
    doc.remove();
});

Model.findOne({_id: 'specific_id'}).remove((err, doc) => {

});

Model.remove({_id: 'specific_id'}, (err, doc) => {

});

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。 事实上,最新的猫鼬查询有 remove 方法。所以,理论上它可以像这样工作:

    AAAModel.find({'category' : category})
      .skip(100)
      .sort({date: -1})
      .remove(function(err, result) {
      if (err) {
        next(err);
      }
      if (result) {
        console.log("Number of deleted records:" +  result);
      }
    });
    

    但在我的例子中,这段代码删除了 all 记录 所以,可能的解决方案是

    AAAModel.find({'category' : category})
      .select("_id")
      .skip(100)
      .sort({date: -1})
      .exec(function(err, idObjLst) {
        if (err) {
          return next(err);
        }
        var ids = idObjLst.map(function(idObj) { return idObj._id; });
        if (ids && ids.length > 0) {
        AAAModel.remove({_id: {$in: ids}}).exec(function(err, result) {
           console.log("Removed " + result + " elements");
         });
    });
    

    可能会相当昂贵

    【讨论】:

    • 好主意,但ids 将是一个看起来像{_id: ObjectId} 的文档数组,所以我认为您还需要使用ids.mapids 重塑为ObjectIds 数组在与$in 一起使用之前。
    • JohnnyHK:你当然是对的,但是,这段代码也可以工作(可能是由于猫鼬内部的特定迭代过程)。我用猫鼬 3.8.22 测试过
    • 有趣,3.8.23 对我不起作用——什么都没有被删除。
    • @JohnnyHK。那很奇怪。我已将猫鼬更新到 3.8.24。我的项目中有一个工作示例。 gist.github.com/loki256/4c3272aa00f179ec5ab4。尽管如此,即使有效也是错误的:)
    • 根据@JohnnyHK 的评论,答案已更新。
    【解决方案3】:

    使用这个查询

     AAAModel.find(
                   {'category' : category}, 
                   { skip: 100,sort:{date: -1}}, 
                   function(err, results) { 
                      if (err) {
                          next(err);
                      }
                      if (result) {
                          result.remove();
                      }
     });
    

    【讨论】:

    • 如何使用remove方法?我想在执行您的查询后删除结果。
    • results 没有删除它们,而是使用 results.forEach(r => r.remove())
    【解决方案4】:

    我们知道,参数results 是您的find 回调中的一个文档数组,而不是单个文档。因此您可以对其进行迭代并逐个删除项目,尽管这不是删除文档以提高性能的最佳方法。

    其实mongooseMode.remove可以用来移除文档,但是查询条件到现在还不能跳过和排序。

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 2013-12-06
      • 1970-01-01
      • 2011-12-14
      • 2014-05-01
      • 2017-05-14
      • 2020-01-31
      • 2017-10-18
      相关资源
      最近更新 更多