最近公司考慮重構資料,因為資料比較複雜,我覺得mongoDB是個非常合適的選擇,就瞭解了一下,
一看之下,嘿,還挺有意思,所以就有了這個系列的讀書筆記,如果有什麼不當,請不吝指出。
另外,有些專用的詞彙我沒有翻譯,一個是不好翻譯,另外是我覺得翻譯了反而會妨礙理解。
本書電子書下載連結 http://download.csdn.net/source/3399006
mongoDB下載連結 http://www.mongodb.org/downloads
--------------------------------------------------------------------------------------------------------------
安裝
解壓縮出來就OK了,mongoDB預設使用磁碟根目錄的data檔案夾和data\db檔案夾,
這兩個檔案夾需要手工建立,如果想使用其他路徑,那麼啟動mongoDB的時候需要指明路徑
運行
運行CMD開啟控制台視窗,導航至mongodb的bin目錄,運行mongod.exe,伺服器就啟動起來了,按ctrl-c結束程式。
另開一個控制台視窗,導航至mongodb的bin目錄,運行mongo.exe來啟動shell,就連結到伺服器了,預設串連到test資料庫。
-------------------------------------------------------------------------------------------------------------
OK,第一章講mongoDB如何如何牛b的我們就隔過去啦,這裡直接是第二章。
1.一些基本概念
document :mongoDB裡邊資料的基本單位,相當於關聯式資料庫裡的行
collection: 相當於關聯式資料庫的表,不過是沒有資料結構定義的
每個mongoDB的執行個體可以運行多個database,每個database有自己的collection和許可權控制
mongoDB擁有一個強大的javascript shell,用於管理資料庫和操作資料
每個document都有一個特殊的key:"_id",這個值在collection內是唯一的
document
document是一組有序的key/value對,使用json風格的資料。
{"foo" : 3, "greeting" : "Hello, world!"}
key是個UTF-8字串,value 可以是很多類型,甚至是一個嵌入的document。
collection
collection是一組document,它是無結構定義的,所以你可以把任何document存入一個collection裡。
subcollection
一個習慣性的組織collection的方式,使用.號分隔,像命名空間。例如,程式裡使用了一個blog,它可能包含一個collection叫blog.post和另外一個collection叫blog.authors,這僅僅是出於組織內容的目的,它們倆看起來像是blog的子集,實際上他們沒有任何關係,甚至blog也許就是不存在的。
database
一個mongoDB的執行個體可以運行多個database,database之間是完全獨立的,每個database有自己的許可權,每個database儲存於磁碟的不同檔案。
2. mongoDB shell
shell本身就是一個javascript解譯器,讓我們來幹點啥來看看
可以進行數學運算
> x = 200
200
> x / 5;
40
可以使用標準的javascript庫
> Math.sin(Math.PI / 2);
1
> new Date("2010/1/1");
"Fri Jan 01 2010 00:00:00 GMT-0500 (EST)"
> "Hello, World!".replace("World", "MongoDB");
Hello, MongoDB!
甚至可以定義javascript函數
> function factorial (n) {
... if (n <= 1) return 1;
... return n * factorial(n - 1);
... }
> factorial(5);
120
能夠執行javascript確實很cool,當然這不是shell的全部功能。
> use foobar
switched to db foobar
然後就可以查看db變數來看看當前資料庫是啥
> db
foobar
- 使用insert函數想collection插入document
先建立一個本地變數叫post
> post = {"title" : "My Blog Post",
... "content" : "Here's my blog post.",
... "date" : new Date()}
{
"title" : "My Blog Post",
"content" : "Here's my blog post.",
"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}
然後把它插入到叫blog的collection裡邊去
> db.blog.insert(post)
然後我們可以用find函數看看blog裡邊的內容
> db.blog.find()
{
"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),
"title" : "My Blog Post",
"content" : "Here's my blog post.",
"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}
裡邊自動加了個叫"_id"的key。
- find返回collection裡的書有document,如果只想查看一個使用findone> db.blog.findOne()
{
"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),
"title" : "My Blog Post",
"content" : "Here's my blog post.",
"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
}
find和findone都可以有查詢條件,第4章查詢裡邊會講。
update函數要有至少兩個參數,第一個是條件,第二個是新的document
先給post變數加一個叫comments的key,給它一個空數組做value。
> post.comments = []
[ ]
執行更新,替換掉title是“My Blog Post”的那個document
> db.blog.update({title : "My Blog Post"}, post)
看看結果
> db.blog.find()
{
"_id" : ObjectId("4b23c3ca7525f35f94b60a2d"),
"title" : "My Blog Post",
"content" : "Here's my blog post.",
"date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)"
"comments" : [ ]
}
- 使用remove刪除document> db.blog.remove({title : "My Blog Post"})
現在這個collection就又空了。
3.基礎資料型別 (Elementary Data Type)
- null
表示一個空值或者不存在的欄位
- boolean
- 32位整數
shell中無法表示,javascript只支援64位浮點小數,所以會被轉化為64位浮點小數。
- 64位整數
同上
- 64位浮點小數
- 字串
- symbol
shell不支援此類型,來自資料庫中的symbol類型資料會轉化為字串
- object id
0 1 2 3 |4 5 6 |7 8 |9 10 11
Timestamp|Machine | PID |Increment
- date
- Regex
- code
- 位元據
- maximum value
bson有這樣一個專門的類型來表示可能的最大值,shell不支援此類型。
- minimum value
- undefined
- array
- embeded document