1. 程式人生 > 實用技巧 >Linux學習-管理檔案(3)

Linux學習-管理檔案(3)

一、nodejs對於mongodb的基本操作

資料庫的開機

首先我們要先對資料庫進行開機的操作,建立一個資料夾用於存放資料庫文件。如D:\mongo,接下去在cmd當中鍵入命令-> mongod --dbpath D:\mongo來實現資料庫的開機。如下圖所示:
接下去就保持這個cmd控制面板處於這種狀態,以確保資料庫處於開機狀態。

連線資料庫

在node.js當中操作mongodb資料庫需要引入第三方模組包mongodb。所以我們先在專案資料夾下鍵入命令-> npm install mongodb來完成下載包。接下去再用const MongoClient = require('mongodb').MongoClient;來完成引包。示例程式碼如下所示:

const MongoClient = require('mongodb').MongoClient;
var dburl = "mongodb://127.0.0.1:27017/test";
MongoClient.connect(dburl, (err, db) => {
	if (err) {
		console.log('資料庫連線失敗!');
		return;
	};
	console.log(db);
});

我們先定義一個dburl變數用於指定本機上27017埠號(mongodb的預設埠號)上的資料庫地址。test為自定義的資料庫的名字。若該資料庫不存在則會自動完成該資料庫的新建。接下去完成與本機上test資料庫的連線,這是一個非同步函式,當連線完成之後,觸發執行其回撥函式,引數db指代這個資料庫本身。接下去對資料庫的增刪改查操作都寫在連線的回撥函式當中。

插入資料

資料插入操作,指的是對資料庫的某個指定集合進行文件物件的插入。同樣是在完成資料庫連線的回撥函式當中對db這個物件進行操作。示例程式碼如下所示:

const MongoClient = require('mongodb').MongoClient;
var dburl = "mongodb://127.0.0.1:27017/test";
MongoClient.connect(dburl, (err, db) => {
	if (err) {
		console.log('資料庫連線失敗!');
		return;
	};
	db.collection('student').insertOne({
		"name": "qianqian"
	}, (err, result) => {
		if (err) {
			console.log('資料插入失敗!');
			db.close();
			return;
		};
		console.log(result);
		db.close();
	});
});

在用node命令執行該檔案之後,這時候我們可以在控制檯或在視覺化工具當中檢視插入結果。

在db物件的collection方法當中寫入集合的名字,若該集合不存在則自動完成新建,使用方法insertOne()來完成一條文件的插入,第一個引數為一個json物件,即插入的那一條文件資料。當完成插入操作之後觸發執行其回撥函式,result表示對插入結果的反饋。由於資料庫不能進行長連線,我們一般都在完成資料庫操作的回撥函式的最後加上db.close();來關閉資料庫。下一次資料庫操作時需要重新連線資料庫。

刪除資料

資料刪除操作,指的是對資料庫的某個指定集合當中匹配上篩選條件的文件進行刪除。同樣是在完成資料庫連線的回撥函式當中對db這個物件進行操作。示例程式碼如下所示:

const MongoClient = require('mongodb').MongoClient;
var dburl = "mongodb://127.0.0.1:27017/test";
MongoClient.connect(dburl, (err, db) => {
	if (err) {
		console.log('資料庫連線失敗!');
		return;
	};
	db.collection('student').deleteMany({
		"name": "qianqian"
	}, (err, result) => {
		if (err) {
			console.log('資料刪除失敗!');
			db.close();
			return;
		};
		console.log(result);
		db.close();
	});
});

使用方法deleteMany()來對該集合當中所有符合篩選條件的文件全部進行刪除,第一個引數為一個json物件,即篩選條件。當完成刪除操作之後觸發執行其回撥函式,result表示對刪除結果的反饋。

修改資料

資料修改操作,指的是對資料庫的某個指定集合當中匹配上篩選條件的所有文件進行修改。同樣是在完成資料庫連線的回撥函式當中對db這個物件進行操作。示例程式碼如下所示

const MongoClient = require('mongodb').MongoClient;
var dburl = "mongodb://127.0.0.1:27017/test";
MongoClient.connect(dburl, (err, db) => {
	if (err) {
		console.log('資料庫連線失敗!');
		return;
	};
	db.collection('student').updateMany({
		"name": "qianqian"
	}, {
		$set: {
			"age": 18
		}
	}, (err, result) => {
		if (err) {
			console.log('資料修改失敗!');
			db.close();
			return;
		};
		console.log(result);
		db.close();
	});
});

使用方法updateMany()來對該集合當中所有符合篩選條件的文件全部進行修改,第一個引數為一個json物件,即篩選條件。第二個引數為一個json物件,即修改條件,語法如上所示。當沒有寫$set這個關鍵字,即{"age":18}代表把匹配上的文件進行替換。當完成修改操作之後觸發執行其回撥函式,result表示對修改結果的反饋。

查詢資料

資料查詢操作,指的是對資料庫的某個指定集合當中匹配上篩選條件的所有文件進行查詢。同樣是在完成資料庫連線的回撥函式當中對db這個物件進行操作。示例程式碼如下所示

const MongoClient = require('mongodb').MongoClient;
var dburl = "mongodb://127.0.0.1:27017/test";
MongoClient.connect(dburl, (err, db) => {
	if (err) {
		console.log('資料庫連線失敗!');
		return;
	};
	var cursor = db.collection("student").find({
		"name": "qianqian"
	});
	var result = [];
	cursor.each((err, doc) => {
		if (err) {
			console.log('資料查詢失敗!');
			db.close();
			return;
		};
		if (doc != null) {
			result.push(doc);
		} else {
			console.log(result);
			db.close();
		};
	});
});

使用方法find()來對該集合當中所有符合篩選條件的文件全部進行查詢,第一個引數為一個json物件,即篩選條件。先定義一個空陣列,用於存放符合條件的文件物件,當完成查詢操作之後觸發執行其回撥函式,這裡的result表示符合條件的文件物件的陣列。我們在find()方法後面繼續加上sort()方法可以實現對查詢的文件物件的排序操作,引數同樣是一個json物件。此外mongodb模組還提供了兩個函式limit()表示限制讀取的條數,skip()表示略過的條數。其引數均為number型別。如把上述程式碼修改為:

var cursor = db.collection("student").find({"name":"qianqian"}).sort({"age":-1}).skip(0).limit(2);

查詢結果為:

獲取該集合當中文件物件的總數

同樣是在完成資料庫連線的回撥函式當中對db這個物件進行操作。示例程式碼如下所示:

const MongoClient = require('mongodb').MongoClient;
var dburl = "mongodb://127.0.0.1:27017/test";
MongoClient.connect(dburl, (err, db) => {
	if (err) {
		console.log('資料庫連線失敗!');
		return;
	};
	db.collection("student").count({}).then(function(count) {
		console.log(count);
		db.close();
	});
});

在回撥函式當中的count即代表資料庫的student這個集合當中資料文件的數目。

二、node.js操作mongodb的常用函式的封裝

我們根據 node.js當中模組化開發的基本流程 寫一個db.js模組,在該模組當中封裝對資料庫的一些基本操作函式。其中db.js的示例程式碼如下所示:

const MongoClient = require('mongodb').MongoClient;
var dburl = "mongodb://127.0.0.1:27017/test";
//連線資料庫操作
function _connectDB(callback) {
	MongoClient.connect(dburl, (err, db) => {
		callback(err, db);
	});
};
//插入函式的封裝
module.exports.insertOne = function(collection, json, callback) {
	_connectDB(function(err, db) {
		if (err) {
			console.log('資料庫連線失敗!');
			return;
		};
		db.collection(collection).insertOne(json, (err, result) => {
			callback(err, result);
			db.close();
		})
	})
};
//刪除函式的封裝
module.exports.deleteMany = function(collection, json, callback) {
	_connectDB(function(err, db) {
		if (err) {
			console.log('資料庫連線失敗!');
			return;
		};
		db.collection(collection).deleteMany(json, (err, result) => {
			callback(err, result);
			db.close();
		});
	});
};
//修改函式的封裝
module.exports.updateMany = function(collection, json1, json2, callback) {
	_connectDB(function(err, db) {
		if (err) {
			console.log('資料庫連線失敗!');
			return;
		};
		db.collection(collection).updateMany(json1, json2, (err, result) => {
			callback(err, result);
			db.close();
		});
	});
};
//獲取集合當中文件的總條數
module.exports.getAllCount = function(collection, callback) {
	_connectDB(function(err, db) {
		if (err) {
			console.log('資料庫連線失敗!');
			return;
		};
		db.collection(collection).count({}).then(function(count) {
			callback(count);
			db.close();
		});
	});
};
//查詢函式的封裝
module.exports.find = function(collection, json, C, D) {
	if (arguments.length == 3) {
		var callback = C;
		var skipnumber = 0;
		var limit = 0;
		var sort = {};
	} else if (arguments.length == 4) {
		var callback = D;
		var args = C;
		var skipnumber = args.pageamount * args.page;
		var limit = args.pageamount;
		var sort = args.sort;
	} else {
		throw new Error('find函式引數個數不正確!');
		return;
	}
	var result = [];
	_connectDB(function(err, db) {
		if (err) {
			console.log('資料庫連線失敗!');
			return;
		};
		var cursor = db.collection(collection).find(json).sort(sort).limit(limit)
			.skip(skipnumber);
		cursor.each((err, doc) => {
			if (err) {
				callback(err, null);
				db.close();
				return;
			};
			if (doc != null) {
				result.push(doc);
			} else {
				callback(null, result);
				db.close();
			}
		})
	});
};

我們每次在使用該模組之前,先對本機上的mongodb資料庫進行開機操作,然後在專案資料夾下下載mongodb這個第三方模組包,然後修改db.js當中的dburl的值,接下去只要在我們自己的主檔案用require的方式進行引入即可。如主檔案1.js與db.js處於同一目錄下,則在1.js當中使用const db = require('./db.js');對該模組進行引入即可。下面給出主檔案的示例程式碼,作為該模組的使用示範:

const db = require('./db.js');
db.insertOne('student', {
	'name': 'qianqiang'
}, (err, result) => {
	if (err) {
		console.log('資料插入失敗!');
		db.close();
		return;
	};
	console.log(result);
});
db.deleteMany('student', {
	'age': 11
}, (err, result) => {
	if (err) {
		console.log('資料刪除失敗!');
		db.close();
		return;
	};
	console.log(result);
});
db.updateMany('student', {
	'age': 18
}, {
	$set: {
		'age': 25
	}
}, (err, result) => {
	if (err) {
		console.log('資料修改失敗!');
		db.close();
		return;
	};
	console.log(result);
});
db.find('student', {}, {
	'pageamount': 2,
	'page': 4,
	'sort': {}
}, (err, result) => {
	if (err) {
		console.log('資料查詢失敗!');
		db.close();
		return;
	};
	console.log(result);
});
db.getAllCount('student', function(count) {
	console.log(count);
});

其中find函式當中的pageamount表示每頁顯示的文件物件的條數,page表示顯示第幾頁的內容(從第0頁開始計數)。以此來實現對查詢資料分頁顯示的功能。