mongodb概念 | 類比sql概念 |
---|---|
文檔document,擁有唯一的鍵值”_id” | 複雜的行 |
集合collection | 沒有模式的表 |
單個實例 - 容納多個獨立的數據庫 |
文檔document
文檔:多個 鍵key
及其關聯的 值value
有序地
放置在一起。
在各種編程語言中表現不同:python字典
,ruby散列
,Go等的映射
。
{“key” : value}
- 文檔中的
鍵值(k-v)
是有順序的。
{"k1":v1,"k2":v2}
不同於{"k2":v2,"k1":v1}
值v
可以是多種數據類型:字符串
,數值
或者另一個文檔
等。鍵k
是字符串。utf-8字符。鍵值(k-v)
是區分鍵大小寫
和值類型
的。鍵k
不能重複。
鍵的命名
滿足下述條件的任意 utf-8
字符串。
- 不能含有結尾符
\0
。 - 不能含有保留字符
.
和$
。 - 不能以
_
開頭。(鍵是被保留的)
集合collection
集合:文檔的集合。類似沒有模式的表。
無模式
值可不同,鍵也可不同。
{“greeting” : "hello",
"foo" : 3}
爲什麼使用多個集合?
查詢簡易度
和查詢速度
會提升。- 把同類型的文檔放在一起,這樣數據會更加集中。
- 創建索引時,文檔會有附加的結構。索引更有效。
命名
滿足下述條件的任意 utf-8
字符串。
- 不能是空字符串
""
。 - 不能含有結尾符
\0
。 - 不能含有保留字符
$
。 - 不能以
system.
開頭。
子集合
使用 "."
分開的按命名空間劃分的子集合,更好的組織數據。如,
blog.posts
blog.authors
數據庫 database
數據庫:集合的集合。
命名
滿足下述條件的任意 utf-8
字符串。
- 不能是空字符串
""
。 - 不能含有結尾符
\0
。 - 不能含有
單引號''
,空 格
,點.
,錢$
,正反斜槓 / \
。 - 全部
小寫
。 - 最多
64
字節。 - 不能是保留名:
admin
,local
,config
因爲數據庫名最終會變成文件系統
裏的文件,所以限制較多。
命名空間
- 命名空間:database_name.collection_name 組成命名空間。
- 命名空間長度 <=
121
字節。實際中應 <=100
字節。
mongodb shell
mongo.exe
,一個自帶的 javascript shell
。從命令行和mongodb交互。
在運行shell
mongo.exe
前,請確保啓動數據庫服務器mongod.exe
。
選擇數據庫
use foobar // db = foobar
查看數據庫
db
1. 增 / 創建文檔
db.collection_name.insert(new_doucment)
2. 增 / 增加鍵值
db.collection_name.update(限定條件_如_{"title":"foo"}, new_key_value)
3. 刪 / 刪除
db.collection_name.remove(限定條件_如_{"title":"foo"})
4. 查 / 讀取
db.collection_name.find() // 返回集合裏所有的文檔
db.collection_name.findOne() // 返回一個文檔
幫助 help
shell中鍵入 help
獲得幫助
help
db.help() // 數據庫相關的幫助
db.collection_name.help() // 集合相關的幫助
function_name // 函數不加括號,顯示該函數的js代碼
db.集合名
db.name
- 當js只有在db中找到
同名
屬性時,會將其作爲方法而非集合名。如,db.version
- 當集合名包含運算符時,如
db.foo-bar
。會做減法運算而報錯。
解決方法,使用getCollection
方法:
db.getCollection("collection_name")
db.getCollection("version")
db.getCollection("foo-bar")
變量訪問子集合
在js中 x.y = x['y']
,也就是說,
db.collection_name.sub_name = db.collection_name[sub_name]
可以如下優雅的書寫,
var sub_collections = ["foo", "bar", "zzz"];
for (i in collections) {
doStuff(db.collection_name[sub_collections]);
}
而不用如此笨拙,
doStuff(db.collection_name.foo);
doStuff(db.collection_name.bar);
doStuff(db.collection_name.zzz);
數據類型
下面介紹shell中支持哪些mongodb的數據類型的顯示。
數據類型 | 描述 | 示例 |
---|---|---|
null | 空值 | {“x” : null} |
bool | true or false | {“x” : true} |
i32 | shell不支持 | 會被轉換爲64bit float |
i64 | shell不支持 | 會被轉換爲64bit float |
f64 | shell中數字都是此類型 | {“x” : 3.14} |
上述的整數也是此類型 | {“x” : 3} | |
string | 字符串,utf-8 | {“x” : “foobar”} |
ObjectId | 文檔的 12字節 唯一ID |
{“x” : ObjectId()} |
date | 日期,從標準紀年的毫秒數 | {“x” : new Date()} |
re | 正則表達式,採用js語法 | {“x” : /foobar/i} |
code | js代碼 | {“x” : function() {/* … */}} |
符號 | shell不支持 | shell將db中的符號轉化爲字符串 |
二進制數據 | shell不支持 | |
最大值 | shell不支持 | |
最小值 | shell不支持 | |
undefined | js中null和undefined是不用類型 | {“x” : underfined} |
array[] | 值和列表的集合 | {“x” : [“a”, “b”, “c”]} |
內嵌文檔{} | 文檔包含文檔 | {“x” : {“y”: “bar”}} |
數字
因爲js只有1種數字類型(f64),而mongodb有3種(i32,i64,f64)。如果數據庫中的數字是i32,在shell中修改後,傳回db的數將變成f64。所以
不要在shell下覆蓋整個文檔。
日期
new Date()
返回的是從標準紀年的毫秒數。- 而單調用構造函數
Date()
則返回的是字符串。
注意,Date函數首字母是大寫。
數組
數組可以作爲有序對象操作(像列表,棧,隊列),也可以作爲無序對象操作(如集合)。能用內容對數組進行查詢和構建索引。
文檔
文檔可以內嵌文檔。
_id
- 文檔必須
只有
一個”_id”的鍵。這個鍵可以是任意類型,但默認是ObjectId對象。 - 2個集合可以有一個相同”_id”鍵。
ObjectId
使用12字節存儲空間。其結構如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
timestamp | machine | PID | counter
儘量在客戶端生成
ObjectId
。
設計理念
能從 服務器端
轉移到 客戶端驅動程序
來做的事就儘量轉移。擴展 應用層
比擴展 數據庫
容易的多。
參考
《mongodb權威指南》
彩蛋
祝大家戊戌狗年旺旺旺!