讀書筆記:NOSQL 菜鳥教程

讀書筆記:NOSQL 菜鳥教程

定義

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}}}])

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容