1、傳統數據庫技術回顧: 數據庫就是存儲數據的,那麼存儲數據就用txt就好了,爲何要用數據庫? 理由之1:數據庫有行、列的概念,數據有關係,數據不是散的 老牌數據庫:MySQL、SQL Server、Oracle、Access。這些叫作結構型數據庫 每一個表中都有明確的字段,每行記錄,都有這些字段,不能有的行有,有的沒有 理由之2:數據庫可以提出很是接口,讓增刪改查操做變得容易 咱們老牌數據庫都無一例外的使用SQL語言,管理數據庫; 好比:查詢全部女生: SELECT * FROM 表名 WHERE xingbie = '女' 再好比 SELECT * FROM 表名 WHERE xingbie = '女' AND nianling < 24 AND nianling >=20 理由之3:數據庫不能本身玩,要給向PHP、.net、JSP等語言提供接口 用PHP這些語言,可以向數據庫之中增刪改查數據庫
老牌的數據庫,如今出了什麼問題? 老牌數據庫,都是結構型數據庫 好比:如今想在一個已經有1000條數據庫的數據庫中增長一個字段,以前已經存在的數據,實際上不須要增長這個字段,由於這些用戶已經填寫完表單了,不須要再增長其餘信息了,咱們的意圖是在從此的信息字段裏再增長新的字段。可是所謂字段就是表的一個結構,全部的行都必須擁有,不能有的行有這個字段,有的行沒有這個字段,可想而知,大數據時代,增長時間太長; 數據不靈活,一個字段,須要是一樣類型的數據,不能一行記錄的是文本,一行記錄的是數字 **非結構型數據庫 NoSQL應運而生** NoSQL是個怪胎,沒法挑戰老牌數據庫,但在大數據時代有着本身的意義 **NoSQL** 沒有行和列的概念, **分類: 鍵值(Key-Value)存儲數據庫:** 這一類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對於IT系統來講的優點在於簡單、易部署。可是若是DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB. **列存儲數據庫:** 這部分數據庫一般是用來應對分佈式存儲的海量數據。鍵仍然存在,可是它們的特色是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak. **文檔型數據庫:** 文檔型數據庫的靈感是來自於Lotus Notes辦公軟件的,並且它同第一種鍵值存儲相相似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,好比JSON。文檔型數據庫可 以看做是鍵值數據庫的升級版,容許之間嵌套鍵值。並且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型數據庫SequoiaDB,已經開源。 **圖形(Graph)數據庫:** 圖形結構的數據庫同其餘行列以及剛性結構的SQL數據庫不一樣,它是使用靈活的圖形模型,而且可以擴展到多個服務器上。NoSQL數據庫沒有標準的查詢語言(SQL),所以進行數據庫查詢須要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。如:Neo4J, InfoGrid, Infinite Graph.
所以,咱們總結NoSQL數據庫在如下的這幾種狀況下比較適用:一、數據模型比較簡單;二、須要靈活性更強的IT系統;三、對數據庫性能要求較高;四、不須要高度的數據一致性;五、對於給定key,比較容易映射覆雜值的環境。json
咱們看,有些數據庫須要篩選,有篩選條件,那麼SQL型數據庫比較擅長,由於他有行、列的概念,可是有些系統不須要進行那麼多的篩選,好比站內信,不須要篩選,只須要存儲,那麼就是NoSQL擅長的 NoSQL不是銀彈,沒有資格挑戰老牌數據庫,仍是特定狀況下,是適合的 **MongoDB** mongo 使用數據庫 mongod 開機 mongoimport 導入數據 開機命令: mongod --dbpath 存放的位置 --dbpath:就是選擇數據庫文檔所在的文件夾,也就是說,mongoDB中,真的有物理文件,對應的一個個數據庫,U盤是能夠拷貝走的 必定要保持,開機的這個CMD不能動了,不能關閉,一旦這個CMD有問題了,那這個數據庫就關閉了,因此,應該再開一個CMD,來進行其餘的操做 mongo語法: show dbs 列出全部數據庫 use 數據庫名字:使用某個數據庫 use 新建數據庫名字:新建一個數據庫 db 查看當前所在的數據庫 db. student. insert({'name':'xiaoming','age':12}) student:就是所謂的集合,集合中存儲着不少json db.一個未知的集合名字,這個集合將自動建立
刪除數據庫 要管理數據庫,必須先開機,開機使用mongod --dbpath 存放的位置 管理數據庫:mongo (必定要在新的CMD裏面) 查看全部數據庫列表:show dbs 使用數據庫、建立數據庫:use 數據庫名 若是真的想把這個數據庫建立成功,那麼必須插入一個數據 數據庫中不能直接插入數據,只能往集合(collections)中插入數據,不須要建立集合,只須要寫點語法 db.student.insert({}) db.student 系統發現student是一個陌生的集合名字,因此就自動建立集合服務器
刪除數據庫:db.dropDatabase() 刪除當前所在的數據庫分佈式
插入數據,隨着數據的插入,數據庫建立成功了,集合也建立成功了。 db.student.insert({'name':'xiaoming'})性能
咱們不可能一條一條的insert,因此,咱們但願用sublime在外部寫好數據,而後導入數據庫裏面 導入外部數據: mongoimport --db test --collection restaurants --drop --file primer-dataset.json --db test 往哪一個數據庫裏面導入 --collection restaurants 往哪一個數據庫裏面的集合中導入 --drop 把以前集合中的數據清空 --file primer-dataset.json 要導入數據的那個文件 這樣,咱們就能用建立一個json文件,而後導入數據庫中大數據
一、查找數據:用find。若是find中沒有任何參數,那麼將列出這個集合的全部文檔 db.集合名.find() 精確匹配: db.student.find({'score.shuxue':70}) 多個條件:多個條件用逗號隔開 db.student.find({'score.shuxue':80,'age':20}) 大於條件:$gt db.student.find({'score.shuxue':{$gt:50}}) 小於條件:$lt db.student.find({'score.shuxue':{$lt:50}}) 與運算用逗號 或運算用 or db.student.find({ $or: [{'score.shuxue':{$lt:50},{'score.yuwen':{$gt:60}}}] }) 查找完畢以後,打點調用sort,表示升降順序 db.restaurants.find().sort({'borough':1,'address.zipcode':1}) 二、刪除 刪除集合:db.student.drop() 刪除集合student 刪除全部數學大於80的 刪除數據:db.student.remove({'score.shuxue':{$gt:80}}) 若是隻想刪除一個數據 刪除數據:db.student.remove({'score.shuxue':{$gt:80}},{justOne:true}) 刪除全部的數據:db.student.remove( {} ) 三、修改數據 db.student.update({'name':'xiaoming'},{$set:{'age':16}}) 修改姓名爲xiaoming的數據,修改數據爲,age屬性值修改成16 批量修改數據: 查找數學成績是70的同窗,把全部的年齡更改成20 db.student.update({'score.shuxue':70},{$set:{'age':20},{multi:true}}).net
替換小明的全部數據 db.student.update({'name':'xiaoming'},{'name':'xiaoqiang','age':20...}) 把$set這個關鍵字去掉就是替換全部的屬性值