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

evi*_*iko 5 mongodb node.js

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

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

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

注意:我正在寻找多个删除和多个返回,这与这个问题不同:如何在MongoDB中删除文档?

rsp*_*rsp 6

不幸的是,deleteMany()只将错误deleteWriteOpResult传递给您的回调,因此不传递实际文档.

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

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

  • 如果操作以写入关注运行,则布尔值确认为true;如果禁用写入关注,则返回false

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

你必须用两个请求来做,但你可以在一个函数中抽象它 - 例如,如果你使用本机Mongo驱动程序,你可以写这样的东西:

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);
        }
      });
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

你可以打电话给:

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

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

注意:曾经有过,findAndRemove()但它已被弃用.

  • 我有同样的问题,用这种方法你可能会得到相互矛盾的结果。当你的 `.find()` 完成并将结果发回给你时,另一个操作可能已经改变了一些文档。如果您然后使用与 .find() 相同的过滤器使用 .deleteMany() ,您可能会删除与最初使用 .find() 找到的文档不同的文档。通过执行 `collection.find(filter,projection = {_id:true}, function (err,data)` 来解决这个问题,并为 `.deleteMany({_id: {"$in": [.find() _id's]}})`(投影是因为你不需要其他属性) (2认同)