定義
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
NoSQL用于超大規(guī)模數(shù)據(jù)的存儲(chǔ)。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無需多余操作就可以橫向擴(kuò)展。
關(guān)系型數(shù)據(jù)庫遵循ACID規(guī)則
事務(wù)在英文中是transaction,和現(xiàn)實(shí)世界中的交易很類似,它有如下四個(gè)特性:
A (Atomicity) 原子性、C (Consistency) 一致性、I (Isolation) 獨(dú)立性、D (Durability) 持久性
RDBMS vs NoSQL
- RDBMS *
- 高度組織化結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化查詢語言(SQL) (SQL)
- 數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中。
- 數(shù)據(jù)操縱語言,數(shù)據(jù)定義語言
- 嚴(yán)格的一致性
- 基礎(chǔ)事務(wù)
- NoSQL *
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預(yù)定義的模式
-鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫 - 最終一致性,而非ACID屬性
- 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
- CAP定理 :CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,最多只能同時(shí)較好的滿足兩個(gè)。
- 高性能,高可用性和可伸縮性
NoSQL的優(yōu)點(diǎn)/缺點(diǎn)
優(yōu)點(diǎn):
- 高可擴(kuò)展性
- 分布式計(jì)算
- 低成本
- 架構(gòu)的靈活性,半結(jié)構(gòu)化數(shù)據(jù)
- 沒有復(fù)雜的關(guān)系
缺點(diǎn): - 沒有標(biāo)準(zhǔn)化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序
BASE
BASE是NoSQL數(shù)據(jù)庫通常對(duì)可用性及一致性的弱要求原則:
Basically Availble --基本可用
Soft-state --軟狀態(tài)/柔性事務(wù)。 "Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"面向連接"的
Eventual Consistency --最終一致性 最終一致性, 也是是 ACID 的最終目的
文檔存儲(chǔ)
MongoDB
CouchDB
文檔存儲(chǔ)一般用類似json的格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔型的。這樣也就有有機(jī)會(huì)對(duì)某些字段建立索引,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫的某些功能。
key-value存儲(chǔ)
Tokyo Cabinet / Tyrant
Berkeley DB
MemcacheDB
Redis
可以通過key快速查詢到其value。一般來說,存儲(chǔ)不管value的格式,照單全收。(Redis包含了其他功能)
語法
連接
''' mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] '''
創(chuàng)建數(shù)據(jù)庫
use DATABASE_NAME 如果數(shù)據(jù)庫不存在,則創(chuàng)建數(shù)據(jù)庫,否則切換到指定數(shù)據(jù)庫。
db 當(dāng)前數(shù)據(jù)庫
show dbs 所有數(shù)據(jù)庫
db.runoob.insert({"name":"菜鳥教程"})
刪除數(shù)據(jù)庫
db.dropDatabase() 刪除當(dāng)前數(shù)據(jù)庫
刪除集合
db.collection.drop() 用法:db.site.drop()
show tables 顯示所有集合
插入文檔
db.COLLECTION_NAME.insert(document)
db.col.save(document) 如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會(huì)更新該 _id 的數(shù)據(jù)。
db.col.find() 查看已插入文檔
update()方法
db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,
writeConcern: <document>})
save()方法
db.collection.save(<document>,{writeConcern: <document>}) save() 方法通過傳入的文檔來替換已有文檔
刪除文檔
db.collection.remove(<query>, <justOne>) justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔。
查詢文檔
db.collection.find(query, projection)
projection :可選,使用投影操作符指定返回的鍵。查詢時(shí)返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。
若不指定 projection,則默認(rèn)返回所有鍵,指定 projection 格式如下,有兩種模式(兩種模式不可混用(因?yàn)檫@樣的話無法推斷其他鍵是否應(yīng)返回))
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
db.col.find().pretty() pretty() 方法以格式化的方式來顯示所有文檔。
操作
格式
范例
RDBMS中的類似語句
等于
{<key>:<value>}
db.col.find({"by":"菜鳥教程"}).pretty()
where by = '菜鳥教程'
小于
{<key>:{$lt:<value>}}
db.col.find({"likes":{$lt:50}}).pretty()
where likes < 50
小于或等于
{<key>:{$lte:<value>}}
db.col.find({"likes":{$lte:50}}).pretty()
where likes <= 50
大于
{<key>:{$gt:<value>}}
db.col.find({"likes":{$gt:50}}).pretty()
where likes > 50
大于或等于
{<key>:{$gte:<value>}}
db.col.find({"likes":{$gte:50}}).pretty()
where likes >= 50
不等于
{<key>:{$ne:<value>}}
db.col.find({"likes":{$ne:50}}).pretty()
where likes != 50
MongoDB AND 條件
db.col.find( {key1:value1, key2:value2} ).pretty()
MongoDB OR 條件
db.col.find({ $or: [{key1: value1}, {key2:value2}] }).pretty()
AND 和 OR 聯(lián)合使用
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
MongoDB 操作符
$gt -------- greater than >
$gte --------- gt equal >=
$lt -------- less than <
$lte --------- lt equal <=
$ne ----------- not equal !=
$eq -------- equal =
$type 操作符
db.col.find({"title" : {$type : 2}})
Double
1
String
2
Object
3
Array
4
Binary data
5
Undefined
6
已廢棄。
Object id
7
Boolean
8
Date
9
Null
10
Regular Expression
11
JavaScript
13
Symbol
14
JavaScript (with scope)
15
32-bit integer
16
Timestamp
17
64-bit integer
18
Min key
255
Query with -1.
Max key
127
MongoDB Limit() 方法
db.COLLECTION_NAME.find().limit(NUMBER)
MongoDB Skip() 方法
db.COLLECTION_NAME.find().skip(NUMBER).limit(NUMBER)
- 當(dāng)查詢時(shí)同時(shí)使用sort,skip,limit,無論位置先后,最先執(zhí)行順序 sort再skip再limit。 *
補(bǔ)充說明skip和limit方法只適合小數(shù)據(jù)量分頁,如果是百萬級(jí)效率就會(huì)非常低,因?yàn)閟kip方法是一條條數(shù)據(jù)數(shù)過去的,建議使用where_limit
MongoDB sort()方法
db.COLLECTION_NAME.find().sort({KEY:1})
MongoDB 索引
db.COLLECTION_NAME.ensureIndex({KEY:1}) 語法中 Key 值為你要?jiǎng)?chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來創(chuàng)建索引指定為-1即可。
ensureIndex() 接收可選參數(shù),可選參數(shù)列表如下:
(db.values.ensureIndex({open: 1, close: 1}, {background: true}))
Parameter
Type
Description
background
Boolean
建索引過程會(huì)阻塞其它數(shù)據(jù)庫操作,background可指定以后臺(tái)方式創(chuàng)建索引,即增加 "background" 可選參數(shù)。 "background" 默認(rèn)值為false。
unique
Boolean
建立的索引是否唯一。指定為true創(chuàng)建唯一索引。默認(rèn)值為false.
name
string
索引的名稱。如果未指定,MongoDB的通過連接索引的字段名和排序順序生成一個(gè)索引名稱。
dropDups
Boolean
在建立唯一索引時(shí)是否刪除重復(fù)記錄,指定 true 創(chuàng)建唯一索引。默認(rèn)值為 false.
sparse
Boolean
對(duì)文檔中不存在的字段數(shù)據(jù)不啟用索引;這個(gè)參數(shù)需要特別注意,如果設(shè)置為true的話,在索引字段中不會(huì)查詢出不包含對(duì)應(yīng)字段的文檔.。默認(rèn)值為 false.
expireAfterSeconds
integer
指定一個(gè)以秒為單位的數(shù)值,完成 TTL設(shè)定,設(shè)定集合的生存時(shí)間。
v
index version
索引的版本號(hào)。默認(rèn)的索引版本取決于mongod創(chuàng)建索引時(shí)運(yùn)行的版本。
weights
document
索引權(quán)重值,數(shù)值在 1 到 99,999 之間,表示該索引相對(duì)于其他索引字段的得分權(quán)重。
default_language
string
對(duì)于文本索引,該參數(shù)決定了停用詞及詞干和詞器的規(guī)則的列表。 默認(rèn)為英語
language_override
string
對(duì)于文本索引,該參數(shù)指定了包含在文檔中的字段名,語言覆蓋默認(rèn)的language,默認(rèn)值為 language.
MongoDB 聚合
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])