mongodb 基礎知識

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 字節。
  • 不能是保留名:adminlocalconfig

因爲數據庫名最終會變成文件系統裏的文件,所以限制較多。

命名空間

  • 命名空間: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

  1. 當js只有在db中找到同名屬性時,會將其作爲方法而非集合名。如,db.version
  2. 當集合名包含運算符時,如 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權威指南》

彩蛋

祝大家戊戌狗年旺旺旺!

發佈了59 篇原創文章 · 獲贊 20 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章