本篇文章將要來說明MongoDB
的刪除方法,rmoeve、deleteOne、deleteMany、bulk
,並且簡單的比較一下速有有何差別。
MongoDB
的刪除方法MongoDB
的刪除方法 ~remove
remove
方法是mongodb
裡最基本的刪除document
的方法,但這邊要注意就算你刪除了document
它的index
與預分配空間
都不會刪除。
使用方法與參數如下
justOne
預設false
,代表query
到幾個就會刪除幾個,true
則只會刪第一個。witeConecern
為拋出異常的級別。collation
是3.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
deleteMany
與deleteOne
也是刪除的方法一種,就一個是刪除多筆和一個是單筆,和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
一個刪除文檔,要同時推出三個方法(新增也是),這到現在還是有點無解,而且remove
在nodejs drivers
已經被Deprecated
(這邊),扣憐……,他建議改用deleteMany
。
也因為上述原因這次測試就跳過remove
了(真的扣憐),因為我們要用nodejs drivers
。
統一都用bulk insert
來進行資料新增,然後再來比較deleteMany
與bulk 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都找不到答案……)
每天要寫一篇真的好難!
快gg囉
阿,剛剛才發現,不小心留了重複的留言,抱歉...
因為很重要所以要說三次
最近剛好有類似需求 Lab了一下 給大家參考
相同條件下:
deleteMany:273699筆 127Sec
bulk.find.remove:258359筆 62Sec
Bulk快蠻多的