NoSQL(Not Only SQL )
非關系型資料庫以鍵值對(key-value)存儲,它的結構不固定,每一條記錄可以有不一樣的鍵,每條記錄可以根據需要增加一些自己的鍵值對,這樣就不會局限于固定的結構,可以減少一些時間和空間的開銷.
在優勢方面主要展現在下面幾點:
簡單的擴充
快速的讀寫
低廉的成本
靈活的資料模型
在不足方面主要有下面幾點:
不提供對SQL的支援
支援的特性不夠豐富
現有的産品不夠成熟
MongoDB
下載下傳 http://www.mongodb.org/downloads
用C++語言編寫的非關系型資料庫。特點是高性能、易部署、易使用,存儲資料十分友善,主要特性有:
面向集合存儲,易于存儲對象類型的資料
模式自由
支援動态查詢
支援完全索引,包含内部對象
支援複制和故障恢複
使用高效的二進制資料存儲,包括大型對象
檔案存儲格式為BSON(一種JSON的擴充)
MongoDB基本概念
1. 文檔(document)是MongoDB中資料的基本單元,非常類似于關系型資料庫系統中的行(但是比行要複雜的多)
2. 集合(collection)就是一組文檔,如果說MongoDB中的文檔類似于關系型資料庫中的行,那麼集合就如同表
3. MongoDB的單個計算機可以容納多個獨立的資料庫,每一個資料庫都有自己的集合和權限
4. MongoDB自帶簡潔但功能強大的JavaScript shell,這個工具對于管理MongoDB執行個體和操作資料作用非常大
5. 每一個文檔都有一個特殊的鍵"_id",它在文檔所處的集合中是唯一的,相當于關系資料庫中的表的主鍵
MongoDB資料類型
資料類型 描述 舉例
null 表示空值或者未定義的對象 {"x":null}
布爾值 真或者假:true或者false {"x":true}
32位整數 32位整數。shell是不支援該類型的,shell中預設會轉換成64位浮點數
64位整數 64位整數。shell是不支援該類型的,shell中預設會轉換成64位浮點數
64位浮點數 64位浮點數。shell中的數字就是這一種類型 {"x":3.14,"y":3}
字元串 UTF-8字元串 {"foo":"bar"}
符号 shell不支援,shell會将資料庫中的符号類型的資料自動轉換成字元串
對象id 文檔的12位元組的唯一id {"id": ObjectId()}
日期 從标準紀元開始的毫秒數 {"date":new Date()}
正規表達式 文檔中可以包含正規表達式,遵循JavaScript的文法 {"foo":/foobar/i}
代碼 文檔中可以包含JavaScript代碼 {"x":function() {}}
未定義 undefined {"x":undefined}
數組 值的集合或者清單 {"arr": ["a","b"]}
内嵌文檔 文檔可以作為文檔中某個key的value {"x":{"foo":"bar"}}
安裝MongoDB
将下載下傳的MongoDB的壓縮檔案解壓到任意目錄,并将其中的bin目錄加入到系統的path環境變量中即可。
在啟動MongoDB之前,要手動建立一個存放MongoDB資料檔案的目錄,如D:\mongo_data
在指令行執行 mongod --dbpath=D:\mongo_data
在指令行中可以使用mongo指令連接配接到MongoDB伺服器,如下,輸入mongo指令預設連接配接到本地的名稱為test的資料庫,如果希望連接配接到遠端資料庫,可以使用mongo ip:port
建立資料庫,使用指令 use 資料庫名稱 ,如:use mydb1
删除目前資料庫,使用指令 db.dropDatabase()
檢視所有資料庫,使用指令 show dbs
檢視目前資料庫中所有的集合,使用指令 show collections 或使用show tables檢視目前所在資料庫,使用指令 db
建立集合有兩種方式,顯示建立和隐式建立
顯示建立可以使用指令 db.createCollection(“集合名稱")
隐式建立可以使用指令 db.集合名稱.insert({}),指建立集合并同時向集合中插入資料,例如:db.customer.insert({name:”jack”})
向集合添加文檔,使用指令 db.集合名稱.insert({}),例如:
db.user1.insert({name:”jack”,age:20})
删除集合中的文檔,
使用指令 db.集合名稱.remove({删除條件}),不加删除條件為删除集合中的所有文檔,例如,db.c1.remove() 為删除c1集合中的所有文檔,db.c1.remove({name:”user1”})為删除c1集合中name為user1的文檔
查詢集合中的文檔,
可以使用指令 db.集合名稱.find({條件}),或者使用 db.集合名稱.findOne() 查詢第一個文檔
查詢集合中的文檔,傳回某些特定的鍵值
查詢集合中的文檔 ,使用條件表達式(<, <=, >, >=,!=)
//大于: field > value
db.collection.find({field:{$gt:value}});
//小于: field < value
db.collection.find({field:{$lt:value}});
//大于等于: field >= value
db.collection.find({field:{$gte:value}});
//小于等于: field <= value
db.collection.find({field:{$lte:value}});
//不等于: field != value
db.collection.find({field:{$ne:value}});
查詢集合中的文檔 ,統計(count)、排序(sort)、分頁(skip、limit)
db.customer.count();
db.customer.find().count();
db.customer.find({age:{$lt:5}}).count();
db.customer.find().sort({age:1}); 降序-1
db.customer.find().skip(2).limit(3);
db.customer.find().sort({age:-1}).skip(2).limit(3);
db.customer.find().sort({age:-1}).skip(2).limit(3).count();
db.customer.find().sort({age:-1}).skip(2).limit(3).count(0);
db.customer.find().sort({age:-1}).skip(2).limit(3).count(1);
查詢集合中的文檔 ,$all主要用來查詢數組中的包含關系,查詢條件中隻要有一個不包含就不傳回
查詢集合中的文檔 ,$in,類似于關系型資料庫中的IN
查詢集合中的文檔 ,$nin,與$in相反
查詢集合中的文檔 ,$or,相當于關系型資料庫中的OR,表示或者的關系,例如查詢name為user2或者age為3的文檔,指令為:
db.customer.find({$or:[{name:”user2”},{age:3}]})
查詢集合中的文檔 ,$nor,表示根據條件過濾掉某些資料,例如查詢name不是user2,age不是3的文檔,指令為:
db.customer.find({$nor:[{name:”user2”},{age:3}]})
查詢集合中的文檔 ,$exists,用于查詢集合中存在某個鍵的文檔或不存在某個鍵的文檔,例如查詢customer集合中存在name鍵的所有文檔,可以使用 db.customer.find({name:{$exists:1}}),
$exists:1表示真,指存在
$exists:0表示假,指不存在
查詢集合中的文檔 ,類似于關系型資料庫,mongodb中也有遊标的概念
更新集合中的文檔,文法如下
db.collection.update(criteria,objNew,upsert,multi)
參數說明:
criteria:用于設定查詢條件的對象
objNew:用于設定更新内容的對象
upsert:如果記錄已經存在,更新它,否則新增一個記錄,取值為0或1
multi:如果有多個符合條件的記錄,是否全部更新,取值為0或1
注意:預設情況下,隻會更新第一個符合條件的記錄
一般情況下後兩個參數分别為0,1 ,即:
db.collection.update(criteria,objNew,0,1)
更新集合中的文檔, $set 用來指定一個鍵的值,如果這個鍵不存在,則建立它。例如:
給name為user1的文檔添加address,可以使用指令:db.c1.update({name:”user1”},{$set:{address:”bj”}},0,1)
将name為user1的文檔修改address為tj,其它鍵值對不變,指令為:
db.c1.update({name:”user1”},{$set:{address:”tj”}},0,1)