1.MongoDB是一個基於分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。是世界上目前用的最廣泛的nosql數據庫
2.noSql 翻譯過來 not only sql 不僅僅是sql 他就是一個非關系型數據庫,它的特點:高性能、易部署、易使用,存儲數據非常方便。
注:①關系型數據庫,是指采用了關系模型來組織數據的數據庫。
關系模型指的就是二維表格模型,而一個關系型數據庫就是由二維表及其之間的聯系所組成的一個數據組織。
關系型數據庫的優點:容易理解:二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網狀、層次等其他模型來說更容易理解。
使用方便:通用的SQL語言使得操作關系型數據庫非常方便。
易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗余和數據不一致的概率
②非關系型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。
3.mongodb的優點:
1/面向文檔儲存的數據庫(BSON格式存儲)
2/具有豐富的查詢指令
3/支持索引
4/具有分片系統
5/無模式
注:①BSON是由10gen(mongodb)開發的一個數據格式,目前主要用於MongoDB中,是MongoDB的數據存儲格式。BSON基於JSON格式,選擇JSON進行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
BSON主要會實現以下三點目標:
1/更快的遍歷速度
對JSON格式來說,太大的JSON結構會導致數據遍歷非常慢。在JSON中,要跳過一個文檔進行數據讀取,需要對此文檔進行掃描才行,需要進行麻煩的數據結構匹配,比如括號的匹配,而BSON對JSON的一大改進就是,它會將JSON的每一個元素的長度存在元素的頭部,這樣你只需要讀取到元素長度就能直接seek到指定的點上進行讀取了。
2/操作更簡易對JSON來說
數據存儲是無類型的,比如你要修改基本一個值,從9到10,由於從一個字符變成了兩個,所以可能其后面的所有內容都需要往后移一位才可以。而使用BSON,你可以指定這個列為數字列,那么無論數字從9長到10還是100,我們都只是在存儲數字的那一位上進行修改,不會導致數據總長變大。當然,在MongoDB中,如果數字從整形增大到長整型,還是會導致數據總長變大的。
3/增加了額外的數據類型
JSON是一個很方便的數據交換格式,但是其類型比較有限。BSON在其基礎上增加了“byte array”數據類型。這使得二進制的存儲不再需要先base64轉換后再存成JSON。大大減少了計算開銷和數據大小。當然,在有的時候,BSON相對JSON來說也並沒有空間上的優勢,比如對{“field”:7},在JSON的存儲上7只使用了一個字節,而如果用BSON,那就是至少4個字節(32位)
②數據分片,將整體數據分攤在多個存儲設備上,這樣每個存儲設備的數據量相對就會小很多,以此滿足系統的性能需求
③無模式:各種形式的NoSQL數據庫有個共同點,那就是它們都沒有模式。若要在關系型數據庫中存儲數據,
首先必須定義“模式”,也就是用一種預定義結構向數據庫說明:要有哪些表格,表中有哪些列,
每一列都存放何種類型的數據。必須先定義好模式,然后才能存放數據。
4.mongodb的缺點
1/占用空間非常大
2/不支持事務
3/目前已經不維護32位的系統的了
注:事務,一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。
5.一個mongodb中可以建立多個數據庫。
6.MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。
7.MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
8.數據庫命名:通過標識符,一般是utf-8字符串,不能為空,不能用local/admin/config這三個
9.mongo的基礎指令
show dbs 獲取你當前所有的數據庫
use dataBase_name 創建數據庫(沒有-創建/存在-使用)
db 指查詢你當前的數據庫
db.stats() 查詢你當前數據庫的狀態
db.dropDatabase() 刪除你當前的數據庫
db.help() 查詢幫助
db.version() 獲取你當前數據庫的版本
db.database_name.help() 查詢任意數據庫的幫助
db.collection_name.find() 查詢你當前集合內的信息
insert插入 db.album.insertOne({‘title’:’xxxx’}),
查看采用db.album.find();
插入多條數據insertMany([{},{},{}])/insert
10.MongoDB-文檔
文檔是一個鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設置相同的字段,並且相同的字段不需要相同的數據類型,這與關系型數據庫有很大的區別,也是 MongoDB 非常突出的特點。
一個簡單的文檔例子如下:
{"genres": ["犯罪","劇情" ],"title": "肖申克的救贖"}
11.MongoDB-集合
集合就是 MongoDB 文檔組,類似於 RDBMS (關系數據庫管理系統:Relational Database Management System)中的表格。
集合存在於數據庫中,集合沒有固定的結構,這意味着你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。
注:集合的命名不能是空字符串,也不能出現-,0等,不能以system,$開頭
12.Collection聚集集合操作
創建一個聚集集合
db.createCollection("collName", {size: 20, capped: true, max: 100});
db.collName.isCapped(); //判斷集合是否為定容量
得到指定名稱的聚集集合
db.getCollection("account");
得到當前db的所有聚集集合
db.getCollectionNames();
顯示當前db所有聚集的狀態
db.printCollectionStats();
刪除集合
db.collectionname.drop();
添加
db.users.save({name: ‘zhangsan', age: 25, sex: true});
修改
所有數據都添加一個artist
db.albums.updateMany({},{$set:{artist:‘哈哈’}})
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
相當於:update users set name = ‘changeName' where age = 25;
1/修改的數據不存在---第一個參數false(不添加)true(添加)
2/數據有重復的---第二個參數true符合條件的數據均修改,false默認修改第一條數據
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
相當於:update users set age = age + 50 where name = ‘Lisi';
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
相當於:update users set age = age + 50, name = ‘hoho' where name = ‘Lisi';
刪除
db.users.remove({age: 132});
查詢所有記錄
db.userInfo.find();
相當於:select* from userInfo;
查詢去重后數據
db.userInfo.distinct("name");
相當於:select distict name from userInfo;
查詢age = 22的記錄
db.userInfo.find({"age": 22});
相當於: select * from userInfo where age = 22;
查詢age > 22的記錄
db.userInfo.find({age: {$gt: 22}});
相當於:select * from userInfo where age >22;
查詢age < 22的記錄
db.userInfo.find({age: {$lt: 22}});
相當於:select * from userInfo where age <22;
查詢age >= 25的記錄
db.userInfo.find({age: {$gte: 25}});
相當於:select * from userInfo where age >= 25;
查詢age <= 25的記錄
db.userInfo.find({age: {$lte: 25}});
查詢age >= 23 並且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
查詢name中包含 mongo的數據
db.userInfo.find({name: /mongo/});
//相當於%%
select * from userInfo where name like ‘%mongo%’;
查詢name中以mongo開頭的
db.userInfo.find({name: /^mongo/});
select * from userInfo where name like ‘mongo%’;
查詢指定列name、age數據
db.userInfo.find({}, {name: 1, age: 1});
相當於:select name, age from userInfo;
查詢指定列name、age數據, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相當於:select name, age from userInfo where age >25;
按照年齡排序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
查詢name = zhangsan, age = 22的數據
db.userInfo.find({name: 'zhangsan', age: 22});
相當於:select * from userInfo where name = ‘zhangsan' and age = ’22';
查詢前5條數據
db.userInfo.find().limit(5);
相當於:select top 5 * from userInfo;
查詢10條以后的數據
db.userInfo.find().skip(10);
相當於:select * from userInfo where id not in (
select top 10 * from userInfo
);
限制數據量/幾條數據后
db.userInfo.find().limit(10).skip(5);
or與 查詢
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相當於:select * from userInfo where age = 22 or age = 25;
查詢第一條數據
db.userInfo.findOne();
相當於:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);
查詢某個結果集的記錄條數
db.userInfo.find({age: {$gte: 25}}).count();
相當於:select count(*) from userInfo where age >= 20;
查詢某一項的記錄數目
db.userInfo.find({sex: {$exists: true}}).count();
相當於:select count(sex) from userInfo;
13. 連接MongoDB(兩種方法,我們常用第二種方法)
第一步:新建一個文件夾,然后在node中運行npm init,npm i mongodb@2 -D,安裝好之后,文件夾下會出來package.json文件,然后會出來node_modules文件夾,注意!!!!在這里一定要在mongodb后面加上版本號@2,這樣就會自動安裝第二版的最新更新,不然會安裝失敗。
第二步:在package.json文件下添加"dev": "node index",然后新建一個index.js文件,在index.js中寫入代碼
方法一:
var mongodb=require('mongodb');//引用mongodb模塊 var server=new mongodb.Server('localhost',27017,{auto_reconnect:true});//端口號 var db=new mongodb.Db('zz1906',server,{safe:true}); db.open((err,dbs)=>{ // dbs==zz1906 if(err) throw err; dbs.collection('info',(err,coll)=>{ // coll==info if(err) throw err; // console.log(coll.find()) coll.find().toArray((err,data)=>{ if(err) throw err; console.log(data) dbs.close() }) }) })
方法二:
var mongodb=require('mongodb').MongoClient; var db_str="mongodb://localhost:27017/zz1906"; mongodb.connect(db_str,(err,dbs)=>{ //dbs==zz1906 if(err) throw err; dbs.collection('info',(err,coll)=>{ //coll==info // if(err) throw err;//打印出來會有很多代碼冗余 // console.log(coll.find()) // dbs.close() if(err) throw err; coll.find().toArray((err,data)=>{//查(減少了很多冗余代碼) if(err) throw err; console.log(data); dbs.close() }) coll.insert({title:'戰狼'},()=>{//增 console.log('success'); dbs.close(); }) coll.remove({title:'吳京'},()=>{//刪 console.log('success'); dbs.close(); }) coll.update({name:"zhangsan"},{$set:{name:'張三'}},()=>{//改 console.log('success'); dbs.close(); }) })
})
14. 連接mongooes
安裝mongooes,在node中輸入npm i mongoose --save-dev, index.js中輸入代碼
var mongoose=require('mongoose'); var db_str="mongodb://localhost:27017/zz1906"; mongoose.connect(db_str) mongoose.connection.on('connected',()=>{ console.log('連接成功') }) mongoose.connection.on('error',()=>{ console.log('error') }) mongoose.connection.on('disconnected',()=>{ console.log('斷開連接') }) var schema=new mongoose.Schema({ name:{type:String,require:true}, content:{type:String,require:true} }) var Cat=new mongoose.model('info',schema) // Cat.find({},(err,data)=>{//查詢 // if(err) throw err; // console.log(data) // mongoose.disconnect() // }) // Cat.create({name:'小明',content:'helloworld'},()=>{//增 // console.log('success') // mongoose.disconnect() // }) // Cat.update({name:'小明'},{$set:{content:'hi'}},()=>{//改 // console.log('success') // mongoose.disconnect() // }) // Cat.remove({name:'小明'},()=>{//刪 // console.log('success'); // mongoose.disconnect() // })
15. 也可以運用軟件robo3t來對數據庫進行操作