MongoDB資料庫中更新與刪除資料
在MongoDB資料庫中,可以使用Collection物件的update方法更新集合中的資料文件。使用方法如下所示:
collection.update(selector, document, [options], [callback]);
selector引數:該引數值為一個物件,用於查詢需要更新的資料文件。該引數值指定的方法和我們前面使用的find方法中使用的selector引數值的指定方法完全相同。
document引數:該引數值為一個物件,用於指定用來更新的資料文件。
options引數:該引數值為一個物件,用於指定更新資料時使用的選項,下面介紹幾個常用的選項屬性:
1. upsert 該屬性值是一個布林值,用於指定是否在跟新資料時執行upsert操作,所謂upsert操作是指當被更新的資料文件不存在時插入一條資料
文件的操作。該屬性值預設為false。
2. multi: 該屬性值也是一個布林值,用於指定是否更新所有符合查詢條件的資料文件。預設值為false(只更新第一條符合查詢條件的資料文件)。
callback引數:用於指定更新資料操作執行結束時執行的回撥函式,該回撥函式的指定方法如下所示:
function(err, result){};
err引數為更新資料操作失敗時丟擲的錯誤物件,result引數值為一個整數值,代表成功更新的資料條數,當更新資料操作失敗時該屬性值為null。
首先我們還是一樣先檢視資料庫中users集合中的所有資料如下,使用程式碼如下:
const mongo = require('mongodb'); const Server = mongo.Server; const Db = mongo.Db; const server = new Server('localhost', '27017', { auto_reconnect: true }); const db = new Db('dataDb', server, { safe: true }); db.open(function(err, db) { if (err) { throw err; } else { console.log('成功建立資料庫連線'); db.collection('users', function(err, collection) { if (err) { throw err; } else { // 開始查詢集合users collection.find({}).toArray(function(err, docs) { if (err) { throw err; } else { console.log(docs); db.close(); } }); } }); } });
如下圖所示:
然後現在我們使用update方法來更新上面的資料,我想把 userName='空智'的資料更新成'龍恩0707',使用方法如下:
collection.update({}, {userName: '龍恩0707'});
如下所有的程式碼:
const mongo = require('mongodb'); const Server = mongo.Server; const Db = mongo.Db; const server = new Server('localhost', '27017', { auto_reconnect: true }); const db = new Db('dataDb', server, { safe: true }); db.open(function(err, db) { if (err) { throw err; } else { console.log('成功建立資料庫連線'); db.collection('users', function(err, collection) { if (err) { throw err; } else { // 開始查詢集合users collection.update({}, {userName: '龍恩0707'}, function(err, result) { if (err) { throw err; } else { collection.find({}).toArray(function(err, docs) { if (err) { throw err; } else { console.log('更新後的資料:'); console.log(docs); db.close(); } }); } }) } }); } });
執行執行結果如下所示:
如上可以看到只更新了第一條資料,那是因為options物件中的屬性multi預設為false,如果需要更改所有的資料的話,需要指定options中的multi屬性為true即可。需要在document引數值物件中使用$set原子操作符。
如下更改程式碼:
collection.update({}, {$set: {userName: '龍恩0707'}}, {multi: true}, function(err, result) {});
如下所有程式碼:
const mongo = require('mongodb'); const Server = mongo.Server; const Db = mongo.Db; const server = new Server('localhost', '27017', { auto_reconnect: true }); const db = new Db('dataDb', server, { safe: true }); db.open(function(err, db) { if (err) { throw err; } else { console.log('成功建立資料庫連線'); db.collection('users', function(err, collection) { if (err) { throw err; } else { // 開始查詢集合users collection.update({}, {$set: {userName: '龍恩0707'}}, {multi: true}, function(err, result) { if (err) { throw err; } else { collection.find({}).toArray(function(err, docs) { if (err) { throw err; } else { console.log('更新後的資料:'); console.log(docs); db.close(); } }); } }) } }); } });
執行結果如下:
3. 理解options物件中的upsert屬性
如果將options引數值物件中的upsert屬性值指定為true,那麼會當集合中不存在符合查詢條件的資料文件時,會將把document引數值物件插入到集合中。
現在我們再來看看在update方法中更新一條userName欄位為 'aaa'的資料文件,users集合中不存在該資料文件的,他會將把update方法中指定
document引數值物件插入到users集合中。如下程式碼:
collection.update({userName: 'aaa'}, {userName: 'aaa'}, {upsert: true}, function(err, result) {});
執行結果如下所示:
可以看到在視窗中顯示users集合中被插入一條資料aaa;
4. remove()方法刪除集合中的資料文件
該方法是刪除集合中的資料文件,該方法使用如下所示:
collection.remove([selector], [options], [callback]);
selector引數用於查詢需要刪除的資料文件。
options引數值為一個物件,用於指定刪除資料時使用的選項. 常用的選項屬性值如下:
single: 屬性值為一個布林值,用於指定是否只刪除第一條滿足查詢條件的資料文件,預設屬性值為false。
callback引數用於指定更新資料操作執行結束時執行的回撥函式,該回撥函式指定的方法如下所示:
function(err, result) {}
err引數為刪除資料操作失敗時丟擲的錯誤物件。result引數值為一個整數值,代表成功刪除的資料條數,當刪除資料失敗時該屬性值為null.
如下的demo,首選往goods這個集合中插入資料後,然後在刪除前查詢下資料有多少,查詢完成後,繼續執行刪除操作,刪除條件就是所有 price
為11的都刪除掉;如下所有程式碼所示:
const mongo = require('mongodb'); const Server = mongo.Server; const Db = mongo.Db; const server = new Server('localhost', '27017', { auto_reconnect: true }); const db = new Db('dataDb', server, { safe: true }); var docs = [ {type: 'food', price: 11}, {type: 'food', price: 10}, {type: 'food', price: 9}, {type: 'food', price: 8}, {type: 'food', price: 7}, ]; db.open(function(err, db) { if (err) { throw err; } else { console.log('成功建立資料庫連線'); db.collection('goods', function(err, collection) { collection.insert(docs, function(err, docs) { if (err) { throw err; } else { collection.find({}).toArray(function(err, docs) { if (err) { throw err; } else { console.log('刪除前的goods集合中的資料為如下:'); console.log(docs); } }); } }); collection.remove({price: 11}, function(err, result) { if (err) { throw err; } else { collection.find({}).toArray(function(err, docs) { if (err) { throw err; } else { console.log('刪除後的資料為:'); console.log(docs); db.close(); } }); } }); }); } });
如下圖所示:
由於options引數物件中的single屬性值預設為false,因此將刪除所有滿足查詢條件的資料文件,如果將該屬性值設定為true,那麼將只刪除第一條滿足條件的資料文件。如下程式碼:
collection.remove({price: 10}, {single: true}, function(err, result) {});
如下圖所示
5. findAndRemove方法查詢並刪除一條資料文件
使用該方法可以查詢並刪除一條資料文件,該方法使用方式如下所示:
collection.findAndRemove(selector, sort, [options], callback);
selector引數值為一個物件,用於查詢需要刪除的資料文件;
sort引數值為一個陣列,用於指定當存在多條符合查詢條件的資料文件時這些資料的排序方式。該陣列包含兩個元素,每個元素都為一個陣列,
第一個元素值為用於排序的欄位名,第二個元素值可以為1或-1,1 是升序, -1是降序。
options值為一個物件,用於指定刪除資料時使用的選項屬性。
callback引數 用於指定刪除資料操作時結束執行的回撥函式,該回撥函式指定方法如下所示:
function(err, doc) {}
err引數值為刪除資料操作失敗時丟擲的錯誤物件。
doc引數值為一個物件,代表刪除的資料文件,當刪除資料失敗時該屬性值為null。