30-7之MongoDB新手村CRUD---刪除
IT 鐵人賽 2016 mongodb
Lastmod: 2019-12-14

本篇文章將要來說明MongoDB的刪除方法,rmoeve、deleteOne、deleteMany、bulk,並且簡單的比較一下速有有何差別。

  • MongoDB的刪除方法
  • 比較一下速度

~ MongoDB的刪除方法 ~

remove

remove方法是mongodb裡最基本的刪除document的方法,但這邊要注意就算你刪除了 document它的index預分配空間都不會刪除。

使用方法與參數如下

  • justOne預設false,代表query到幾個就會刪除幾個,true則只會刪第一個。
  • witeConecern為拋出異常的級別。
  • collation3.4版開始支持的功能,可依照語言定義來針對文字的內容進行解讀,再還沒支持collation前一徑依字節來對比。
db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>,
     collation: <document>
   }
)

使用範例如下,我們來新增三筆資料,然後刪除掉steven該筆資料。

db.user.insert({"name":"mark","age":23});
db.user.insert({"name":"steven","age":23});
db.user.insert({"name":"jj","age":23});

db.user.remove({"name":"steven"})

刪除所有資料

remove可以用來刪除collection的所有資料,但還有另一種方法也是刪除collection的所有資料,那就是drop,但它同時會將index給全部刪除。

兩種的使用方法如下。

db.user.remove({})

db.user.drop()

deleteMany與deleteOne

deleteManydeleteOne也是刪除的方法一種,就一個是刪除多筆和一個是單筆,和remove不同點大概只差在回傳值上,至於速度上等等來trytry看。

使用兩種方法的參數如下,與remove也大至差不多。

db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

使用範例如下。

db.user.insert({"name":"mark","age":23});
db.user.insert({"name":"steven","age":23});
db.user.insert({"name":"jj","age":23});

db.user.deleteMany({"name":"steven"})
db.user.deleteOne({"name":"jj"})

bulk delete

bulk操作故明思意就是要來衝一下大筆資料刪除的效能方法。

使用方法如下。

//先新增二筆資料
var bulk = db.collection.initializeUnorderedBulkOp();
bulk.insert( { name: "mark"} );
bulk.insert( { name: "hoho"} );
bulk.execute();

//然後再刪除掉mark該筆
var bulk = db.collection.initializeUnorderedBulkOp();
bulk.find( { "name": "mark" } ).remove();
bulk.execute();

~ 來比較一下速度 ~

事實上用到現在有時會在想為什麼mongodb一個刪除文檔,要同時推出三個方法(新增也是),這到現在還是有點無解,而且removenodejs drivers已經被Deprecated(這邊),扣憐……,他建議改用deleteMany

也因為上述原因這次測試就跳過remove了(真的扣憐),因為我們要用nodejs drivers

測試案例

統一都用bulk insert來進行資料新增,然後再來比較deleteManybulk delete不同數量的刪除速度。

測試程式碼如下github

debugger;
var mongodb = require('mongodb');

var mongodbServer = new mongodb.Server('localhost', 27017, {
  auto_reconnect: true,
  poolSize: 10
});

var db = new mongodb.Db('test', mongodbServer);
var count = 1000000;
db.open(function() {
  db.collection('home', function(err, collection) {

    /*
     * deleteMany  測試 
     */
    var bulk = collection.initializeUnorderedBulkOp();
    for (var i = 0; i < count; i++) {
      bulk.insert({
        "id": 1,
        "name": "mark",
        "Like": 0
      });
    }
    bulk.execute(function(err, res) {
      console.time("deleteMany");
      collection.deleteMany({
        "name": "mark"
      }, function(err, res) {
        console.timeEnd("deleteMany");
      });
    });


    /*
     * bulk  測試 
     */
    var bulk = collection.initializeUnorderedBulkOp();
    for (var i = 0; i < count; i++) {
      bulk.insert({
        "id": 2,
        "name": "steven",
        "Like": 0
      });
    }
    bulk.execute(function(err, res) {
      console.time("bulkDelete");
      var deletebulk = collection.initializeUnorderedBulkOp();
      deletebulk.find({
        "name": "steven"
      }).remove();
      deletebulk.execute(function(err, res) {
        console.timeEnd("bulkDelete");
      })
    });
  });
});


從下測試就果可知幾個結論

  • bulk在數量大時速度優於deleteMany,但好像沒有優於很多…。
測試案例(更新次數) deleteMany bulk
10 3ms 5ms
1000 16ms 18ms
10000 106ms 99ms
50000 845ms 495ms
100000 1100ms 963ms
1000000 11131ms 100470ms

~ 結語 ~

說實話不確定是不是我的測試方法問題(應該是沒有),雖然bulk預期的是跑的比deleteMany還快,但 是並沒有到很快,這邊又會讓人想思考為什麼一個刪除document當初會有分這幾種方法?只是因為回傳值的不同????希望這30天可以不小心的找出答案……希望……(stackoverflow都找不到答案……)

~ 參考資料 ~

comments powered by Disqus