準備工作

繼續(xù)連接到mongo

C:\Users\zouqi>mongo
MongoDB shell version: 3.0.7connecting to: test

查看數(shù)據(jù)庫和集合

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> show dbs
demo        0.078GB
local       0.078GB
myDatabase  0.078GB
myTest      0.078GB> use myTest
switched to db myTest> show collections
persons
system.indexes

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

創(chuàng)建簡單索引

數(shù)據(jù)準備,在CMD命令窗口中輸入如下初始化腳本:

for(var i=0;i<200000;i++){db.books.insert({number:i,name:"book"+i})}

1、先檢查一下查詢性能

執(zhí)行如下腳本:
var start=new Date()
db.books.find({number:20540})
var end=new Date()
end - start

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.books.find({number:20540})
{ "_id" : ObjectId("5953c63a797216100b773acb"), "number" : 20540, "name" : "book20540" }> var start=new Date()> db.books.find({number:20540})
{ "_id" : ObjectId("5953c63a797216100b773acb"), "number" : 20540, "name" : "book20540" }> var end=new Date()> end - start110

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

2、為number創(chuàng)建索引

(1代表升序,-1代表降序),在創(chuàng)建索引的時候,由于數(shù)據(jù)量比較大,會比較耗時,我們會看到執(zhí)行創(chuàng)建索引腳本的時候,光標會有一定的延時。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.books.ensureIndex({number:1})
{        "createdCollectionAutomatically" : false,        "numIndexesBefore" : 1,        "numIndexesAfter" : 2,        "ok" : 1}>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

3、再執(zhí)行第一步的代碼可以看出有數(shù)量級的性能提升

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> var start=new Date()> db.books.find({number:20540})
{ "_id" : ObjectId("5953c63a797216100b773acb"), "number" : 20540, "name" : "book20540" }> var end=new Date()> end - start15
>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

之前耗時是110毫秒,創(chuàng)建索引號耗時是15毫秒。

索引使用需要注意的地方

  1. 創(chuàng)建索引的時候要注意后面參數(shù):1是正序 -1是倒序

  2. 索引的創(chuàng)建在提高查詢性能的同時會影響插入的性能,對于經(jīng)常查詢少超入的文檔可以考慮用索引。

  3. 組合索引要注意索引的先后順序

  4. 每個鍵都創(chuàng)建索引不一定就能夠提高性能

  5. 在做排序工作的時候,如果是超大數(shù)據(jù)量也是可以考慮加上索引用來提高排序的性能。

索引的名稱可以用MongoVUE來查看

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)
創(chuàng)建索引的同時我們還可以指定索引的名字
db.booksensureIndex({name:1},{name:"bookname")

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

4、唯一索引

如何解決文檔books不能插入重復(fù)的數(shù)值?建立唯一索引

db.books.ensureIndex({name:-1},{unique:true})

測試:db.books.insert({name:"hello"})

運行結(jié)果如下:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.books.insert({name:"hello"})
WriteResult({ "nInserted" : 1 })> db.books.insert({name:"hello"})
WriteResult({        "nInserted" : 0,        "writeError" : {                "code" : 11000,                "errmsg" : "E11000 duplicate key error index: myTest.books.$name_-1 dup key: { : \"hello\" }"
        }
})>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

5、刪除重復(fù)值

如果創(chuàng)建唯一索引之前已經(jīng)存在重復(fù)數(shù)值該如何處理

db.books.ensureIndex({name:-1},{unique:true,dropDups:true})

6.Hint

如何強制查詢使用指定的索引?

db.books.find({name:"hello",number:1}).hint({name:-1})

注意:指定索引必須是已經(jīng)創(chuàng)建了的索引

7、Expain

如何詳細查看本次查詢使用哪個索引和查詢數(shù)據(jù)的狀態(tài)信息
db.books.find({name:"hello"}).explain()

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.books.find({name:"hello"}).explain()
{        "queryPlanner" : {                "plannerVersion" : 1,                "namespace" : "myTest.books",                "indexFilterSet" : false,                "parsedQuery" : {                        "name" : {                                "$eq" : "hello"
                        }
                },                "winningPlan" : {                        "stage" : "FETCH",                        "inputStage" : {                                "stage" : "IXSCAN",                                "keyPattern" : {                                        "name" : 1
                                },                                "indexName" : "bookname",                                "isMultiKey" : false,                                "direction" : "forward",                                "indexBounds" : {                                        "name" : [                                                "[\"hello\", \"hello\"]"
                                        ]
                                }
                        }
                },                "rejectedPlans" : [
                        {                                "stage" : "FETCH",                                "inputStage" : {                                        "stage" : "IXSCAN",                                        "keyPattern" : {                                                "name" : -1
                                        },                                        "indexName" : "name_-1",                                        "isMultiKey" : false,                                        "direction" : "forward",                                        "indexBounds" : {                                                "name" : [                                                        "[\"hello\", \"hello\"]"
                                                ]
                                        }
                                }
                        }
                ]
        },        "serverInfo" : {                "host" : "DESKTOP-V7CFIC3",                "port" : 27017,                "version" : "3.0.7",                "gitVersion" : "6ce7cbe8c6b899552dadd907604559806aa2e9bd"
        },        "ok" : 1}

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

索引管理

1、system.indexes

在shell查看數(shù)據(jù)庫中已經(jīng)建立的索引
db.system.indexes.find()

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "number" : 1 }, "name" : "number_1", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "name" : 1 }, "name" : "bookname", "ns" : "myTest.books" }
{ "v" : 1, "unique" : true, "key" : { "name" : -1 }, "name" : "name_-1", "ns" : "myTest.books" }>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

db.system.namespaces.find()

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.system.namespaces.find()
{ "name" : "myTest.system.indexes" }
{ "name" : "myTest.persons" }
{ "name" : "myTest.persons.$_id_" }
{ "name" : "myTest.books" }
{ "name" : "myTest.books.$_id_" }
{ "name" : "myTest.books.$number_1" }
{ "name" : "myTest.books.$bookname" }
{ "name" : "myTest.books.$name_-1" }>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

2、后臺執(zhí)行

執(zhí)行創(chuàng)建索引的過程中會暫時鎖表,此問題如何解決?
為了不影響查詢,我們可以讓索引的創(chuàng)建過程在后臺執(zhí)行 
db.books.ensureIndex({number:1},{background:true})

3、刪除索引

批量和精確刪除索引
db.runCommand({dropIndexes:"books",index:"name_-1"})

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.runCommand({dropIndexes:"books",index:"name_-1"})
{ "nIndexesWas" : 4, "ok" : 1 }> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "number" : 1 }, "name" : "number_1", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "name" : 1 }, "name" : "bookname", "ns" : "myTest.books" }>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

db.runCommand({dropIndexes:"books",index:"*"})

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

> db.runCommand({dropIndexes:"books",index:"*"})
{        "nIndexesWas" : 3,        "msg" : "non-_id indexes dropped for collection",        "ok" : 1}> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.books" }>

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

Count&Distinct&Group

1、Count

請查詢persons中美國學(xué)生的人數(shù)
db.persons.find({country:"USA"}).count()

2、Distinct

請查詢出persons中一共有多少個國家分別是什么
db.runCommand({distinct:"persons",key:"country"}).values

3、Group

語法:
db.runCommand({group:{
ns:集合名稱,
Key:分組的鍵對象,
Initial:初始化累加器,
$reduce:組分解器,
Condition:條件,
Finalize:組玩?zhèn)髌?br/>}})
分組首先會按照key進行分組,每組的每一個文檔都要執(zhí)行$reduce的方法,它接收2個參數(shù),一個是組內(nèi)本條記錄,一個是累加器數(shù)據(jù)。
請查出persons中每隔國家學(xué)生數(shù)學(xué)成績最好的學(xué)生信息(必須在90分以上)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

db.runCommand({group:{
ns:"persons",
key:{"country":true},
initial:{m:0},$reduce:function(doc,prev){if(doc.m>prev.m){
prev.m=doc.m;
prev.name=doc.name;
prev.country=doc.country;
}
},
condition:{m:{$gt:90}}
}})

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

在上面實例的基礎(chǔ)之上把每個人的信息連接起來寫一個描述賦值到m上
finalize:function(prev){
prev.m=prev.name+"Math scores"+prev.m
}

數(shù)據(jù)庫命令操作

1、用命令執(zhí)行一次刪除表操作

db.runCommand({drop:"map"})

2、如何查詢mongoDB為我們提供額命令

db.listCommands()

3、常用命令舉例
查詢服務(wù)器版本號和主機操作系統(tǒng)

db.runCommand({buildInfo:1})

查詢執(zhí)行集合的詳細信息,大小、空間、索引等

db.runCommand({collStats:"persons"})

查看操作本集合最后一次錯誤信息

db.runCommand({getLastError:"persons"})

 

博客地址:http://www.cnblogs.com/jiekzou/
博客版權(quán):本文以學(xué)習(xí)、研究和分享為主,歡迎轉(zhuǎn)載,但必須在文章頁面明顯位置給出原文連接。
如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起討論,共同進步!
再次感謝您耐心的讀完本篇文章。QQ群1:已滿 大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn) QQ群2:313744535 大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

我的拙作《ASP.NET MVC企業(yè)級實戰(zhàn)》已經(jīng)出版,希望大家多多支持!

給我打賞

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

http://www.cnblogs.com/jiekzou/p/7092158.html