MongoDB是開源,高性能的NoSQL數(shù)據(jù)庫;支持索引、集群、復(fù)制和故障轉(zhuǎn)移、各種語言的驅(qū)動程序豐富;高伸縮性;
MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫。由 C++ 語言編寫。旨在為 WEB 應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。
MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。
官網(wǎng)地址:http://www.mongodb.org/
github:https://github.com/mongodb/
API Docs:http://docs.mongodb.org/manual/
nodejs驅(qū)動:https://github.com/mongodb/node-mongodb-native
下載地址:http://www.mongodb.org/downloads
下載成功后點擊msi文件直接安裝,這里以win7_64位的操作系統(tǒng)為例。
1)、創(chuàng)建存放數(shù)據(jù)的文件夾
在任意沒有中文的目錄下新建文件夾,如c:\data,在文件夾下存放MongoDB數(shù)據(jù)庫文件與日志文件,如:
c:\data\db用于存放mongodb的數(shù)據(jù)文件
c:\data\log用于存放mongodb的日志文件
2)、創(chuàng)建配置文件
打開MongoDB的安裝目錄如“C:\Program Files\MongoDB\Server\3.4\bin”,并在此目錄下新建一個mongo.config文件,文件內(nèi)容如下:
3) 、安裝Windows服務(wù)
使用cmd進入命令行
使用cd切換目錄到安裝目錄下,如:cd C:\Program Files\MongoDB\Server\3.4\bin
安裝MongoDB服務(wù)且指定配置文件,如:
mongod --config "C:\Program Files\MongoDB\Server\3.4\bin\mongo.config" --install
4)、錯誤處理
如果運行過程中提示“無法定位程序輸入點ucrtbase.terminate于動態(tài)鏈接庫api-ms-win-crt-runtime-|1-1-0.dll”錯誤,請下載安裝“vc_redist.x64”,如果vc redis.x64安裝失敗請先下載補丁(KB2999226)再安裝。
5)、添加環(huán)境變量
在計算機->右鍵->高級->在環(huán)境變量PATH中加入"C:\Program Files\MongoDB\Server\3.4\bin"路徑。
6)、啟動服務(wù)
在cmd窗口中運行如下命令開始服務(wù),也可以在可以在“控制面板\所有控制面板項\管理工具\服務(wù)”手動開啟,注意默認是開機就自動啟動服務(wù)的,可以設(shè)置成手動啟動。
net start mongodb
停止服務(wù)
net stop mongodb
在cmd中運行如下命令
這樣安裝就成功了!
1)、直接運行
如果安裝完成后不想做任何配置,可以直接運行,其中mongod.exe是服務(wù),應(yīng)該先啟動,如:
啟動客戶端mongo.exe文件,如:
2)、啟動服務(wù)后運行
使用net start mongodb或手動啟動服務(wù)器運行客戶端mongo.exe文件。
3)、可視化工具
當(dāng)服務(wù)啟動成功后,如果認為命令行操作不方便,可以使用robomongo等GUI工具。
官網(wǎng):https://robomongo.org/
第二項是一個綠色版的,解壓后在文件夾中找到exe文件直接運行即可。
以下實例我們創(chuàng)建了數(shù)據(jù)庫gomall
> use gomall
switched to db gomall
> db
gomall
如果使用GUI工具在連接名稱上右鍵create database也可以創(chuàng)建數(shù)據(jù)庫:
創(chuàng)建成功后如下所示:
Collections表示集合,類似關(guān)系數(shù)據(jù)庫中的表。
Functions表示函數(shù),類似關(guān)系數(shù)據(jù)庫中的存儲過程與函數(shù)。
Users表示用戶。
document表示記錄,類似關(guān)系數(shù)據(jù)為中的記錄或行。
如果你想查看所有數(shù)據(jù)庫,可以使用 show dbs 命令:
> show dbs
MongoDB 中默認的數(shù)據(jù)庫為 test,如果你沒有創(chuàng)建新的數(shù)據(jù)庫,集合將存放在 test 數(shù)據(jù)庫中。
> use gomall
switched to db gomall
> db.dropDatabase()
{ "dropped" : "gomall", "ok" : 1 }
a)、db.集合.insert(數(shù)據(jù))
這里的數(shù)據(jù)可以是JSON
先打開shell腳本編寫的界面,操作如下:
db.products.insert({name:"iphone",price:1988});
從上圖操作可以看出,沒有去創(chuàng)建“products”集合,其實通過插入操作也會自動創(chuàng)建
_id,是mongodb自已生成的,每行數(shù)據(jù)都會存在,默認是ObjectId,可以在插入數(shù)據(jù)時插入這個鍵的值(支持mongodb支持的所有數(shù)據(jù)類型)
查看數(shù)據(jù):db.getCollection('products').find({})
b)、db.表名.save(數(shù)據(jù));
db.products.save({_id:2,name:"HuWei P9",price:2988});
_id可以自已插入、一個表中不一定要字段都相同,雖然insert和save方法都可以插入數(shù)據(jù),當(dāng)默認的“_id”值已存在時,調(diào)用insert方法插入會報錯;而save方法不會,會更新相同的_id所在行數(shù)據(jù)的信息。
c)、批量添加
mongodb的shell中可以使用javascript腳本,如
for(var i=0;i<5;i++)db.users.save({'_id':i,'name':'zhangguo'+i,'age':i+8});
a)、查詢集合中所有數(shù)據(jù):db.集合.find();
db.users.find({name:'zhangguo0'});
b)、按條件查詢(支持多條件):db.集合.find(條件);
db.users.find({name:'zhangguo0',age:9});
對象中的條件要求同時成立
c)、查詢第一條(支持條件):db.集合.findOne(條件);
d)、限制數(shù)量:db.集合.find().limit(數(shù)量);
e)、跳過指定數(shù)量:db.表名.find().skip(數(shù)量);
f)、比較查詢
大于:gt小于:lt
大于等于:gte小于等于:lte
非等于:$ne
db.users.find({age:{'$gt':9}});
查找年齡大于9且小于11歲的
db.users.find({age:{'gt′:9,′lt':11}});
g)、查詢數(shù)量:db.表名.find().count();
h)、排序:db.表名.find().sort({"字段名":1});
1:表示升序,-1:表示降序
i)、指定字段返回: db.表名.find({},{"字段名":0}); 參數(shù)1:返回 0:不返回
前面save在_id字段已存在是就是修改操作,按指定條件修改語法如下:
db.集合.update({"條件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}});
db.users.update({age:{'eq':9}},{set:{age:100}});
修改多條:
db.users.updateMany({age:{"gte":10}},{set:{age:30}});
db.集合.remove(條件);
db.users.remove({age:{'$gte':10}}); 刪除年齡>=10歲的數(shù)據(jù)
MongoDB對許多平臺都提供驅(qū)動可以訪問數(shù)據(jù)庫,如C#、Java、Node.js等。這里以Node.js為例。
使用包管理器,在命令行執(zhí)行如下指令:
全局安裝驅(qū)動
npm install mongodb -g
在當(dāng)前項目中引入mongodb
npm install mongodb --save
這樣添加驅(qū)動就成功了。
在項目的根目錄下新建一個db.js文件,使用Node.js操作MongoDB。
示例代碼:
//引入mongodb模塊,獲得客戶端對象var MongoClient = require('mongodb').MongoClient;//連接字符串var DB_CONN_STR = 'mongodb://localhost:27017/gomall'; //定義函數(shù)表達式,用于操作數(shù)據(jù)庫并返回結(jié)果var insertData = function(db, callback) { //獲得指定的集合 var collection = db.collection('users'); //插入數(shù)據(jù) var data = [{_id:7,"name":'rose',"age":21},{_id:8,"name":'mark',"age":22}]; collection.insert(data, function(err, result) { //如果存在錯誤 if(err) { console.log('Error:'+ err); return; } //調(diào)用傳入的回調(diào)方法,將操作結(jié)果返回 callback(result); });}//使用客戶端連接數(shù)據(jù),并指定完成時的回調(diào)方法MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連接成功!"); //執(zhí)行插入數(shù)據(jù)操作,調(diào)用自定義方法 insertData(db, function(result) { //顯示結(jié)果 console.log(result); //關(guān)閉數(shù)據(jù)庫 db.close(); });});
運行結(jié)果:
連接成功!{ result: { ok: 1, n: 2 }, ops: [ { _id: 7, name: 'rose', age: 21 }, { _id: 8, name: 'mark', age: 22 } ], insertedCount: 2, insertedIds: [ 7, 8 ] }
示例代碼:
//引入mongodb模塊,獲得客戶端對象var MongoClient = require('mongodb').MongoClient;//連接字符串var DB_CONN_STR = 'mongodb://localhost:27017/gomall'; //定義函數(shù)表達式,用于操作數(shù)據(jù)庫并返回結(jié)果var updateData = function(db, callback) { //獲得指定的集合 var collection = db.collection('users'); //要修改數(shù)據(jù)的條件,>=10歲的用戶 var where={age:{"$gte":10}}; //要修改的結(jié)果 var set={$set:{age:95}}; collection.updateMany(where,set, function(err, result) { //如果存在錯誤 if(err) { console.log('Error:'+ err); return; } //調(diào)用傳入的回調(diào)方法,將操作結(jié)果返回 callback(result); });}//使用客戶端連接數(shù)據(jù),并指定完成時的回調(diào)方法MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連接成功!"); //執(zhí)行插入數(shù)據(jù)操作,調(diào)用自定義方法 updateData(db, function(result) { //顯示結(jié)果 console.log(result); //關(guān)閉數(shù)據(jù)庫 db.close(); });});
運行結(jié)果:
連接成功!{ result: { n: 5, nModified: 5, ok: 1 }
示例代碼:
//引入mongodb模塊,獲得客戶端對象var MongoClient = require('mongodb').MongoClient;//連接字符串var DB_CONN_STR = 'mongodb://localhost:27017/gomall'; //定義函數(shù)表達式,用于操作數(shù)據(jù)庫并返回結(jié)果var findData = function(db, callback) { //獲得指定的集合 var collection = db.collection('users'); //要查詢數(shù)據(jù)的條件,<=10歲的用戶 var where={age:{"$lte":10}}; //要顯示的字段 var set={name:1,age:1}; collection.find(where,set).toArray(function(err, result) { //如果存在錯誤 if(err) { console.log('Error:'+ err); return; } //調(diào)用傳入的回調(diào)方法,將操作結(jié)果返回 callback(result); });}//使用客戶端連接數(shù)據(jù),并指定完成時的回調(diào)方法MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連接成功!"); //執(zhí)行插入數(shù)據(jù)操作,調(diào)用自定義方法 findData(db, function(result) { //顯示結(jié)果 console.log(result); //關(guān)閉數(shù)據(jù)庫 db.close(); });});
運行結(jié)果:
連接成功![ { _id: 0, name: 'zhangguo0', age: 8 }, { _id: 1, name: 'zhangguo1', age: 9 } ]
示例代碼:
//引入mongodb模塊,獲得客戶端對象var MongoClient = require('mongodb').MongoClient;//連接字符串var DB_CONN_STR = 'mongodb://localhost:27017/gomall'; //定義函數(shù)表達式,用于操作數(shù)據(jù)庫并返回結(jié)果var findData = function(db, callback) { //獲得指定的集合 var collection = db.collection('users'); //要刪除數(shù)據(jù)的條件,_id>2的用戶刪除 var where={_id:{"$gt":2}}; collection.remove(where,function(err, result) { //如果存在錯誤 if(err) { console.log('Error:'+ err); return; } //調(diào)用傳入的回調(diào)方法,將操作結(jié)果返回 callback(result); });}//使用客戶端連接數(shù)據(jù),并指定完成時的回調(diào)方法MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("連接成功!"); //執(zhí)行插入數(shù)據(jù)操作,調(diào)用自定義方法 findData(db, function(result) { //顯示結(jié)果 console.log(result); //關(guān)閉數(shù)據(jù)庫 db.close(); });});
運行結(jié)果:
連接成功!{ result: { n: 4, ok: 1 },
git:https://coding.net/u/zhangguo5/p/NodeJS002/git