Mongodb + Node.js:删除多个文档并返回它们

时间:2016-11-28 12:21:22

标签: node.js mongodb

我正在使用以下代码一次删除多个文档:

db.collection('testcollection').deleteMany({
    id: {
        $in: ['1', '2', '3']
    }
}, function (error, response) {
    // ...
});

有没有办法一次删除并返回所有已删除的文档?

注意:我正在寻找 多个删除和多个返回,这与此问题不同:How to get removed document in MongoDB?

2 个答案:

答案 0 :(得分:5)

不幸的是,deleteMany()仅将errordeleteWriteOpResult传递给您的回调,因此不会传递实际文档。

这不仅仅适用于Node.js - 这实际上是db.collection.deleteMany在Mongo中的工作方式:

  

返回:包含以下内容的文档:

     
      
  • 如果是,则布尔值被确认为true   如果写入关注,则操作以写入关注运行或为false   停用

  •   
  • deletedCount包含已删除文档的数量

  •   

你必须用两个请求来做,但你可以在一个函数中抽象它 - 例如如果你使用的是native Mongo driver,你可以这样写:

function getAndDelete(collectionName, filter, callback) {
  var collection = db.collection(collectionName);
  collection.find(filter, function (err, data) {
    if (err) {
      callback(err);
    } else {
      collection.deleteMany(filter, function (err, r) {
        if (err) {
          callback(err);
        } else {
          callback(null, data);
        }
      });
    }
  });
}

您可以致电:

getAndDelete('testcollection', {
    id: {
        $in: ['1', '2', '3']
    }
}, function (error, response) {
    // ...
});

此代码未经过测试,只是为了让您了解从哪里开始。

注意:曾经有findAndRemove(),但已被弃用。

答案 1 :(得分:0)

我找到了一种简单的方法来完成此任务。我们可以使用async和await概念,这使代码变得不那么复杂。

const getDeletedData = async(filter) => {
        const products = await collection.find({filter});
        await collection.deleteMany({filter});

     return products;
    }

然后您可以使用过滤器调用getDeletedData({name:“ xyz”})