MongoDB

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):

  1. 當(dāng)調(diào)用 find() 函數(shù)時(shí),并不立即查詢數(shù)據(jù)庫(kù),而是等真正開(kāi)始獲取結(jié)果時(shí)才發(fā)送查詢請(qǐng)求。

  2. 游標(biāo)對(duì)象的每個(gè)方法幾乎都會(huì)返回游標(biāo)對(duì)象本身,這樣可以方便進(jìn)行鏈?zhǔn)胶瘮?shù)的調(diào)用。

  3. 在 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)迭代。

  4. 使用清空后的游標(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

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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