2016-11-28 82 views
2

我用下面的代碼在一次刪除多個文件:的MongoDB Node.js的+:刪除多個文檔,並返回他們

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

有沒有辦法刪除和一個返回所有刪除的文檔走?

注意:我在尋找多個刪除和返回,比這個問題不同:How to get removed document in MongoDB?

+2

AFAIK,你不能那樣做。首先獲取所需的對象,然後刪除 – sidgate

回答

3

不幸的是,僅deleteMany()經過errordeleteWriteOpResult到您的回調使沒有實際的文件通過。

這不僅僅是Node.js的 - 這實際上是如何db.collection.deleteMany作品蒙戈:

返回:包含的文件:

  • 一個布爾值確認爲真,如果 操作如果寫入關注是 已禁用,則寫入關注或錯誤

  • deletedCount包含的數目del eted文件

你有兩個要求這樣做,但你可以將它抽象掉在一個單一的功能 - 例如,如果您使用的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

我有同樣的問題,並採用這種方法可以得到相互矛盾的結果。當你的'.find()'完成並且已經把結果發回給你時,另一個操作可能改變了一些文檔。如果你使用'.deleteMany()'使用與'.find()'相同的過濾器,那麼你可能會刪除不同於最初使用'.find()'找到的文檔的文檔。通過執行'collection.find(filter,projection = {_id:true},function(err,data)''併爲'.deleteMany({_ id:{「$ in」:[.find() _id's]}})'(投影是因爲你不需要其他屬性) – Dex