1. 基本介紹
1.1 存儲(chǔ)結(jié)構(gòu)
| 描述 | MongoDB | MySQL |
|---|---|---|
| 數(shù)據(jù)庫(kù) | database | database |
| 集合/表 | collection | table |
| 文檔/行 | document | row |
| 字段屬性/列 | field | column |
| 表關(guān)聯(lián) | 不支持 | join |
| 主鍵 | primary key | primary key |
1.2 文檔關(guān)系
- 引用
{
_id:"joe",
name:"Joe Bookreader"
}
{
patron_id:"joe",
street:"123 Fake Street",
city:"Faketon",
state:"MA",
zip:"2345"
}
- 嵌入
{
_id:"joe",
name:"Joe Bookreader",
address:{
street:"123 Fake Street",
city:"Faketon",
state:nMAnz
zip:T2345"
}
}
{
_id:"joe",
name:"Joe Bookreader",
addresses:[
{
street:"123 Fake Streetn,
city:"Faketon",
state:"MA",
zip:"12345"
},
{
street:"l Some Other Street",
city:"Boston",
state:"MA",
zip:"12345"
}
]
}
1.3 BSON數(shù)據(jù)類型
| 類型 | 描述示例 |
|---|---|
| NULL | 表示空值或者不存在的字段,{"x":null} |
| Boolean | 布爾型有 true 和 false,{"x":true} |
| Number | 數(shù)值:客戶端默認(rèn)使用 64 位浮點(diǎn)型數(shù)值。{"x":3.14} 或 {"x":3}。對(duì)于整型值,包括 NumberInt(4 字節(jié)符號(hào)整數(shù))或 NumberLong(8 字節(jié)符號(hào)整數(shù)),用戶可以指定數(shù)值類型,{"x":NumberInt("3")} |
| String | 字符串:BSON 字符串是 UTF-8,{"x":"中文"} |
| Regular Expression | 正則表達(dá)式:語(yǔ)法與JavaScript 的正則表達(dá)式相同,{"x":[cba]} |
| Array | 數(shù)組:使用"[]"表示,{"x":["a", "b", "c"]} |
| Object | 內(nèi)嵌文檔:文檔的值是嵌套文檔,{"a":{"b":3}} |
| ObjectId | 對(duì)象 id:對(duì)象 id 是一個(gè) 12 字節(jié)的字符串,是文檔的唯一標(biāo)識(shí),{"x":objectId()} |
| BinaryData | 二進(jìn)制數(shù)據(jù):二進(jìn)制數(shù)據(jù)是一個(gè)任意字節(jié)的字符串。它不能直接在 Shell 中使用。如果要將非 UTF-8 字符保存到數(shù)據(jù)庫(kù)中,二進(jìn)制數(shù)據(jù)是唯一的方式 |
| JavaScript | 代碼:查詢和文檔中可以包括任何 JavaScript 代碼,{"x":function(){/.../}} |
| Date | 日期:{"x":new Date()} |
| Timestamp | 時(shí)間戳:var a = new Timestamp() |
2. 安裝
3. 語(yǔ)法
3.1 數(shù)據(jù)庫(kù)
3.1.1 命名規(guī)則
| 序號(hào) | 注意事項(xiàng) |
|---|---|
| 1 | 不能是空串 |
| 2 | 不得含有 /、\、?、$、空格、空字符等,基本只能使用 ASCII 中的字母和數(shù)字 |
| 3 | 區(qū)分大小寫(xiě),建議全部小寫(xiě) |
| 4 | 名稱最多為 64 字節(jié) |
| 5 | 不得使用保留的數(shù)據(jù)庫(kù)名,如:admin、local、config |
3.1.2 保留數(shù)據(jù)庫(kù)
| 庫(kù)名 | 作用 |
|---|---|
| admin | 權(quán)限數(shù)據(jù)庫(kù),添加用戶到該數(shù)據(jù)庫(kù)中,該用戶會(huì)自動(dòng)繼承數(shù)據(jù)庫(kù)的所有權(quán)限 |
| local | 數(shù)據(jù)庫(kù)中的數(shù)據(jù)永遠(yuǎn)不會(huì)被復(fù)制 |
| config | 分片時(shí),config 數(shù)據(jù)庫(kù)在內(nèi)部使用,保存分子信息 |
| test | 默認(rèn)數(shù)據(jù)庫(kù),可以用來(lái)做各種測(cè)試等 |
3.1.3 常用腳本
| 功能 | 腳本 |
|---|---|
| 使用及查看數(shù)據(jù)庫(kù) | use test |
| 展示所有數(shù)據(jù)庫(kù) | show dbs |
| 統(tǒng)計(jì)數(shù)據(jù)庫(kù)信息 | db. stats () |
| 刪除數(shù)據(jù)庫(kù) | db.dropDatabase () |
| 查看所有集合名稱 | db.getCollectionNames () |
3.2 集合
3.2.1 命名規(guī)則
| 序號(hào) | 注意事項(xiàng) |
|---|---|
| 1 | 集合名不能是空串 |
| 2 | 不能含有空字符 \0 |
| 3 | 不能以“system.”開(kāi)頭,這是系統(tǒng)集合保留的前綴 |
| 4 | 集合名不能含保留字符“$” |
3.2.2 常用腳本
- 創(chuàng)建集合【顯式】
db.createCollection(name, options)
name:要?jiǎng)?chuàng)建的集合名稱
options:指定內(nèi)存大小和索引,詳見(jiàn)下面表格:
| 參數(shù) | 類型 | 描述 |
|---|---|---|
| capped | Boolean | (可選)如果為 true,則啟用封閉的集合。上限集合是固定大小的集合,它在達(dá)到其最大時(shí)自動(dòng)覆蓋其最舊的條目。如果指定 true,則還需要指定 size 參數(shù) |
| size | 數(shù)字 | (可選)指定上限集合的最大大?。ㄒ宰止?jié)為單位)。如果 capped 為 true,那么還需要指定次字段的值 |
| max | 數(shù)字 | (可選)指定上限集合中允許的最大文檔數(shù) |
示例:db.createCollection("testcollection", {capped:true,size:6142800,max:10000 })
- 創(chuàng)建集合【隱式】
db.testdb.insert( {"testcollection":"123"} )
當(dāng)插入文檔時(shí),集合不存在,則MongoDB會(huì)隱式的自動(dòng)創(chuàng)建集合。
- 其他常用腳本
| 功能 | 腳本 |
|---|---|
| 查看集合詳細(xì)信息 | show collections |
| 重命名集合 | renamecollection() |
| 刪除集合 | db.testcollection.drop() |
3.2 文檔
注意:文檔鍵值對(duì)有序,且嚴(yán)格區(qū)分鍵值對(duì)的數(shù)據(jù)類型及大小寫(xiě)
3.2.1 數(shù)據(jù)插入
方法:insert()、insertOne()、insertMany()
語(yǔ)法:
db.collection.insert(
<document or array of documents>,
{
writeConcern:<document>, //可選字段
ordered:<boolean> //可選字段
}
)
- <document or array of documents> 參數(shù)表示可設(shè)置插入一條或多條文檔。
- writeConcern:<document> 參數(shù)表示自定義寫(xiě)出錯(cuò)的級(jí)別,是一種出錯(cuò)捕捉機(jī)制。
- ordered:<boolean> 是可選的,默認(rèn)為 true。
- 如果為 true,在數(shù)組中執(zhí)行文檔的有序插入,并且如果其中一個(gè)文檔發(fā)生錯(cuò)誤,MongoDB 將返回而不處理數(shù)組中的其余文檔;
- 如果為 false,則執(zhí)行無(wú)序插入,若其中一個(gè)文檔發(fā)生錯(cuò)誤,則忽略錯(cuò)誤,繼續(xù)處理數(shù)組中的其余文檔。
示例:
testdb.testcollection.insert({name:"andy",age:15})
testdb.testcollection.insert({_id:10, name:"andy",age:15})
testdb.testcollection.insert(
[
{ _id:11, name:"jack", age:50, address:"test address" },
{ name:"rose", age:20 },
{ name:"kevin", age:25 }
],
{ordered:true}
)
// 變量方式插入
document=({_id:10, name:"andy",age:15})
> db.test.insert(document)
3.2.2 更新數(shù)據(jù)
3.2.2.1 update
語(yǔ)法:
db.collection.update(
<query>,
<update>,
{
upsert,
multi,
writeConcern,
collation
}
)
<query>:參數(shù)設(shè)置查詢條件。
<update>:為更新操作符。
upsert:為布爾型可選項(xiàng),表示如果不存在 update 的記錄,是否插入這個(gè)新的文檔。true 為插入;默認(rèn)為 false,不插入。
multi:也是布爾型可選項(xiàng),默認(rèn)是 false,只更新找到的第一條記錄。如果為 true,則把按條件查詢出來(lái)的記錄全部更新。
writeConcem:表示出錯(cuò)級(jí)別。
collation:指定語(yǔ)言。
示例:
// 將名字為jack的年齡設(shè)置為50歲
db.test.update(
{
name:"jack"
},
{
$set:{age:50}
}
db.createCollection ("person", {collation:{locale:"zh" }}) //創(chuàng)建集合并指定語(yǔ)言
db.person.insert ({name:"張三"})
db.person.insert ({name:"李四"})
db.person.insert ({name:"王五"})
db.person.insert ({name:"馬六"})
db.person.insert ({name:"張七"})
db.person.find().sort({name:1}) //查詢并排序
//查詢返回結(jié)果
{ "_id":Objectld ("586b995d0cec8d86881cffae") , "name":"李四" }
{ "_id":Objectld ("586b995d0cec8d8 6881cffb0") , "name":"馬六" }.
{ "_id":Objectld ("586b995d0cec8d86881cffaf"), "name":"王五" }
{ "_id":Objectld ("586b995d0cec8d86881cffb1"), "name":"張七" }
{ "_id":Objectld ("586b995d0cec8d86881cffad"), "name":"張三" }
3.2.2.2 save
db.collection.save (obj)
如果存在與obj的_id相同的數(shù)據(jù)則替換數(shù)據(jù),如果不存在則插入數(shù)據(jù)
3.2.3 刪除數(shù)據(jù)
3.2.3.1 remove
永久刪除MongoDB集合中的數(shù)據(jù)
-
語(yǔ)法
db.collection.remove( <query>, { justOne:<boolean>, writeConcern:<document> } )- query:必選項(xiàng),是設(shè)置刪除的文檔的條件。
- justOne:布爾型的可選項(xiàng),默認(rèn)為false,刪除符合條件的所有文檔,如果設(shè)為 true,則只刪除一個(gè)文檔。
- writeConcem:可選項(xiàng),設(shè)置拋出異常的級(jí)別。
-
示例
db.test.remove({'title':'MongoDB'}) db.test.remove( { age:{$gt:3} } )
3.2.3.2 delete
官方推薦使用deleteOne 和 deleteMany方法刪除文檔,格式如下
// 刪除集合下所有的文檔
db.collection.deleteMany ({})
// 刪除年齡為20歲的所有文檔
db.collection.deleteMany ({ age:20 })
// 刪除年齡為20歲的第一個(gè)文檔
db.collection.deleteOne ({ age:20 })
3.2.4 查詢數(shù)據(jù)
3.2.4.1 語(yǔ)法
db.collection.find(query, projection)
- query 為可選項(xiàng),設(shè)置查詢操作符指定查詢條件;
- projection 也為可選項(xiàng),表示使用投影操作符指定返回的字段,如果忽略此選項(xiàng)則返回所有字段。
格式化顯示:db.test.find().pretty()
3.2.4.2 查詢條件
| 操作符 | 格式 | 示例 | 與 RDBMS where 語(yǔ)句比較 |
|---|---|---|---|
| 等于(=) | {key:{value}} | db.test.find( {age:24} ) | where price = 24 |
| 大于(>) | {key:{$gt:value}} | db.test.find( {age:{$gt:24}} ) | where price > 24 |
| 小于(<) | {key:{$lt:value}} | db.test.find( {age:{$lt:24}} ) | where price < 24 |
| 大于等于(>=) | {key:{$gte:value}} | db.test.find( {age:{$gte:24}} ) | where price >= 24 |
| 小于等于(<=) | {key:{$lte:value}} | db.test.find( {age:{$lte:24}} ) | where price <= 24 |
| 不等于(!=) | {key:{$ne:value}} | db.test.find( {age:{$ne:24}} ) | where price != 24 |
| 與(and) | {key01:value01, key02:value02, ...} | db.test.find( {name:"jack", price:24} ) | where name = "jack" and price = 24 |
| 或(or) | {$or:[{key01:value01}, {key02:value02}, ...]} | db.test.find( {$or:[{name:"jack"},{price:24}]} ) | where name = "jack" or price = 24 |
特定語(yǔ)法:
// 不僅會(huì)查詢到年齡為空的,也會(huì)匹配到所有不包含該鍵值的文檔
db.test.find({age:null})
// 查詢數(shù)組
db.test.find(
{
emails:['aaa@163.com', 'bbb@163.com']
}
)
// 查詢size=2的數(shù)組
db.test.find(
{
emails:{$size:2}
}
)
// 查詢數(shù)組包含某個(gè)值
db.test.find(
{
emails: "aaa@163.com"
}
)
// 現(xiàn)在查詢結(jié)果個(gè)數(shù)
db.test.find().limit(3)
// 跳過(guò)指定數(shù)量的文檔
db.test.find().skip(1)
// 對(duì)結(jié)果排序 1升序 -1降序
db.test.find().sort({"age" : 1})
// 正則表達(dá)式匹配
db.test.find({age:{$regex:2*}})
3.2.4.3 游標(biāo)
使用find行數(shù)可以返回游標(biāo)
| 方法名 | 作用 |
|---|---|
| hasNext | 判斷是否有更多的文檔 |
| next | 用來(lái)獲取下一條文檔 |
| toArray | 將查詢結(jié)構(gòu)放到數(shù)組中 |
| count | 查詢的結(jié)果為文檔的總數(shù)量 |
| limit | 限制查詢結(jié)果返回?cái)?shù)量 |
| skip | 跳過(guò)指定數(shù)目的文檔 |
| sort | 對(duì)查詢結(jié)果進(jìn)行排序 |
| objsLeftlnBatch | 查看當(dāng)前批次剩余的未被迭代的文檔數(shù)量 |
| addOption | 為游標(biāo)設(shè)置輔助選項(xiàng),修改游標(biāo)的默認(rèn)行為 |
| hint | 為查詢強(qiáng)制使用指定索引 |
| explain | 用于獲取查詢執(zhí)行過(guò)程報(bào)告 |
| snapshot | 對(duì)查詢結(jié)果使用快照 |
注意事項(xiàng):
當(dāng)調(diào)用 find() 函數(shù)時(shí),并不立即查詢數(shù)據(jù)庫(kù),而是等真正開(kāi)始獲取結(jié)果時(shí)才發(fā)送查詢請(qǐng)求。
游標(biāo)對(duì)象的每個(gè)方法幾乎都會(huì)返回游標(biāo)對(duì)象本身,這樣可以方便進(jìn)行鏈?zhǔn)胶瘮?shù)的調(diào)用。
在 MongoDB Shell 中使用游標(biāo)輸出文檔包含兩種情況,如果不將 find() 函數(shù)返回的游標(biāo)賦值給一個(gè)局部變量進(jìn)行保存,在默認(rèn)情況下游標(biāo)會(huì)自動(dòng)迭代 20 次。如果將 find() 函數(shù)返回的游標(biāo)賦值給一個(gè)局部變量,則可以使用游標(biāo)對(duì)象提供的函數(shù)進(jìn)行手動(dòng)迭代。
使用清空后的游標(biāo),進(jìn)行迭代輸出時(shí),顯示的內(nèi)容為空。
游標(biāo)被銷毀:
- 客戶端保存的游標(biāo)變量不在作用域內(nèi)。
- 游標(biāo)遍歷完成或者客戶端主動(dòng)發(fā)送終止消息。
- 在服務(wù)器端 10 分鐘內(nèi)未對(duì)游標(biāo)進(jìn)行操作。
示例:
var cursor = db.test.find()
while (cursor.hasNext()){
var doc = cursor.next();
print(doc.name);
print(doc);
printjson(doc);
}
3.2.5 索引
3.2.5.1 創(chuàng)建索引
| 索引類型 | 說(shuō)明 | 語(yǔ)法 | 排序 |
|---|---|---|---|
| 單鍵索引 | 支持文檔集合中任何字段的索引 |
db.collection.createlndex({key:1})//1 為升序,-1 為降序 |
索引鍵的排序順序無(wú)關(guān)緊要 |
| 復(fù)合索引 | 支持復(fù)合索引,包含多個(gè)字段 | db.records.createIndex ({"key1": 1,key2": 1 }) |
需要注意索引順序問(wèn)題,會(huì)導(dǎo)致查詢結(jié)果不一致 |
| 多鍵值索引 | 為包含數(shù)組的字段建立索引, MongoDB 會(huì)為數(shù)組中的每個(gè)元素創(chuàng)建索引鍵。 |
db.collecttion.createlndex({key:1}) |
集合中包含多個(gè)待索引字段是數(shù)組,則無(wú)法創(chuàng)建復(fù)合多鍵索引。 |
| 地理索引 | |||
| 全文索引 | 支持對(duì)字符串內(nèi)容的文本搜索查詢,但檢索時(shí)間較長(zhǎng) | db.collection.createIndex ({ key: "text" }) |
|
| 散列索引 | 按照某個(gè)字段的散列值來(lái)建立索引 | db.collection.createlndex( { _id : "hashed" }) |
不支持范圍查詢,散列索引會(huì)將浮點(diǎn)數(shù)截?cái)酁?4位整數(shù) |
稀疏索引 db.collection.createlndex ({"key":1},{sparse:true})
- 只檢索包含具有索引字段的文檔,即使索引字段包含空值,檢索時(shí)也會(huì)跳過(guò)所有缺少索引字段的文檔
- 非稀疏索引包含集合中的所有文檔,存儲(chǔ)不包含索引字段的文檔的空值。
唯一索引 db.collection.createlndex ({"key":1},{unique:true})
過(guò)期索引 db.collection.createlndex({"key":1},{expireAfterSeconds:3600})
3.2.5.2 索引操作
| 功能 | 腳本 |
|---|---|
| 查看集合的所有索引 | db.collection.getIndexes() |
| 刪除索引 | // 刪除特定索引 db.collection.dropIndex({"key":1}) // 刪除所有索引 db.collection.dropIndexes() |
| 修改索引 | 如果需要修改索引,則需要?jiǎng)h除現(xiàn)有索引后重新創(chuàng)建索引 |
3.2.5 聚合查詢
MongoDB提供了三種執(zhí)行聚合的方法:
- 聚合管道
- map-reduce
- 單一目標(biāo)聚合方法
4. 分布式部署
[TODO-LIST]
創(chuàng)建索引
地理索引
聚合查詢
http://c.biancheng.net/view/6563.html
安裝
分布式部署
http://c.biancheng.net/view/6567.html
可視化工具Robomongo