我正在使用以下代码一次删除多个文档:
db.collection('testcollection').deleteMany({
id: {
$in: ['1', '2', '3']
}
}, function (error, response) {
// ...
});
有没有办法一次删除并返回所有已删除的文档?
注意:我正在寻找 多个删除和多个返回,这与此问题不同:How to get removed document in MongoDB?
答案 0 :(得分:5)
不幸的是,deleteMany()
仅将error和deleteWriteOpResult传递给您的回调,因此不会传递实际文档。
这不仅仅适用于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”})