標籤:mysql 開發 記錄 collection 關聯式資料庫
0)mongo :通過用戶端串連mongodb資料庫
1)show dbs ---顯示當前所建立的資料庫
2)use test ---建立或切換資料庫
3)db.dropDatabase() --刪除當前資料庫
3)show collections: 顯示當前資料庫所建立的集合(表)
4)exit:退出mongodb用戶端
5)mongodb的安裝:
一、Mogodb開篇:基礎入門增刪改查
MongoDB的優點:
1)內建Sharding:提供基於Range的Auto Sharding機制:一個collection可按照記錄的範圍,
分成若干個段,切分到不同的Shard上。適當的時候可以無痛的升級
2)支援分布式,效能優越
在使用場合下,千萬層級的文檔對象,近10G的資料,對有索引的ID的查詢不會比mysql慢,
而對停用字詞段的查詢,則是全面勝出。 mysql實際無法勝任大資料量下任意欄位的查詢,
而mongodb的查詢效能實在驚訝。寫入效能同樣很令人滿意,同樣寫入百萬層級的數 據,
基本10分鐘以下可以解決
mongodb中有三元素:資料庫,集合,文檔,其中“集合”,就是對應關聯式資料庫中的“表”,“文檔”對應“行”。
下載
上MongoDB官網 ,我們發現有32bit和64bit,這個就要看你系統了,不過這裡有兩點注意:
①:根據業界規則,偶數為“穩定版”(如:1.6.X,1.8.X),奇數為“開發版”(如:1.7.X,1.9.X),
這兩個版本的區別相信大家都知道吧。
②:32bit的mongodb最大隻能存放2G的資料,64bit就沒有限制
啟動
啟動之前,我們要給mongodb指定一個檔案夾,這裡取名為”db",用來存放mongodb的資料
然後運行mongod開啟命令,同時用--dbpath指定資料存放地點為“db”檔案夾。
例子:mongod --dbpath=e:\mongodb\db
最後要看下是否開啟成功,的資訊中獲知,mongodb採用27017連接埠,
那麼我們就在瀏覽器裡面鍵入“http://localhost:27017/”
基本操作
由於是開篇,就大概的說下基本的“增刪查改“,我們再開一個cmd,輸入mongo命令開啟shell,
其實這個shell就是mongodb的用戶端,同時也是一個js的編譯器,預設串連的是“test”資料庫
1)insert操作
db.person.insert({"name":"lxg","age":20})
資料庫有了,下一步就是集合,這裡就取集合名為“person”,要注意的是文檔是一個json的擴充(Bson)形式
2)find操作
db.person.find({"name":"lxg"});
我們將資料插入後,肯定是要find出來這裡要注意兩點:
“_id": 這個欄位是資料庫預設給我們加的GUID,目的就是保證資料的唯一性
3)update操作
db.person.update({"name":"lxg"},{"name":"wr","age":20})
update方法的第一個參數為“尋找的條件”,第二個參數為“更新的值”
4)remove操作
db.person.remove({"name":"lxg"})
remove中如果不帶參數將刪除所有資料,呵呵,很危險的操作,在mongodb中是一個不可撤回的操作
二、MongoDB第二篇:細說增刪改查
1)Insert操作
常見的插入操作也就兩種形式存在:“單條插入”和“批量插入”
單條插入
先前也說了,mongo命令開啟的是一個javascript shell。所以js的文法在這裡面都行得通,
看起來是不是很牛X。
var single={"name":"lxg"}
db.user.insert(single);
2)Find操作
日常開發中,我們玩查詢,玩的最多的也就是二類:
①: >, >=, <, <=, !=, =。
②:And,OR,In,NotIn
這些操作在mongodb裡面都封裝好了,下面就一一介紹:
<1>"$gt", "$gte", "$lt", "$lte", "$ne", "沒有特殊關鍵字"這些跟上面是一一對應的舉幾個例子
db.user.find({"age":{$lt:22}})
<2> "無關鍵字“, "$or", "$in","$nin" 同樣我也是舉幾個例子
db.user.find({"name":"lxg","age":20})
db.user.find($or,[{"name":"lxg"},{"name":"wr"}])
db.user.find({"name":{$in:["lxg","wr"]}})
db.user.find({"name":{$nin:["lxg","wr"]}})
<3> 在mongodb中還有一個特殊的匹配,那就是“Regex”,這玩意威力很強的
db.user.find({"name":/^j/,"name":/e$/})
<4> 有時查詢很複雜,很蛋疼,不過沒關係,mongodb給我們祭出了大招,它就是$where,
為什麼這麼說,是因為$where中的value就是我們非常熟悉,非常熱愛的js來助我們一馬平川
db.user.find({$where:function(){return this.name ==‘jack‘}})
3)Update操作:更新操作無非也就兩種,整體更新和局部更新
我在上一篇使用update的時候,其實那種update是屬於整體更新
局部更新:有時候我們僅僅需要更新一個欄位,而不是整體更新
① $inc修改器:$inc也就是increase的縮寫
db.user.update({"name":"jack"},{$inc:{"age":30}})
② $set修改器
db.user.update({"name":"jack"},{$set:{"age":10}})
<3> upsert操作
這個可是mongodb創造出來的“詞”,大家還記得update方法的第一次參數是“查詢條件”嗎?
那麼這個upsert操作就是說:如果沒查到,就在資料庫裡面新增一條,其實這樣也有好處,
就是避免了我在資料庫裡面判斷是update還是add操作,使用起來很簡單將update的第三
個參數設為true即可
db.user.update({"name":"jack"},{$inc:{"age":1},true}) --如果查詢不到就添加一條記錄
<4> 批次更新
在mongodb中如果匹配多條,預設的情況下只更新第一條,那麼如果我們有需求必須批次更新,
那麼在mongodb中實現也是很簡單的,在update的第四個參數中設為true即可。例子就不舉了
三、Mogodb第三篇:細說進階操作
彙總:常見的彙總操作跟oracle一樣,有:count,distinct,group,mapReduce
<1> count:它的使用跟sql裡面的使用一樣
db.person.count()
db.person.count({"age":20})
<2> distinct:指定了誰,誰就不能重複
db.person.distinct("age")
結果:[20,22,26]
<3> group
在mongodb裡面做group操作有點小複雜,不過大家對oracle裡面的group比較熟悉的話還是一眼能看的明白的,
其實group操作本質上形成了一種“k-v”模型,就像C#中的Dictionary,好,有了這種思維,
我們來看看如何使用group
下面舉的例子就是按照age進行group操作,value為對應age的姓名。下面對這些參數介紹一下:
key: 這個就是分組的key,我們這裡是對年齡分組。
initial: 每組都分享一個”初始化函數“,特別注意:是每一組,比如這個的age=20的value的list分享一個
initial函數,age=22同樣也分享一個initial函數。
$reduce: 這個函數的第一個參數是當前的文檔對象,第二個參數是上一次function操作的累計對象,第一次
為initial中的{”perosn“:[]}。有多少個文檔, $reduce就會調用多少次
db.person.group({
"key":{"age":true},
"initial":{"person":[]},
"reduce":function(cur,prev){
prev.person.push(cur.name);
}
})
結果:
[
{"age":20,
"person":[
"lxg",
"wr",
"lisi"
]
},
{"age":22,
"person":[
"jialiu",
"zs"
]
}
]
看到上面的結果,是不是有點感覺,我們通過age查看到了相應的name人員,不過有時我們可能有如下的要求:
①:想過濾掉age>25一些人員。
②:有時person數組裡面的人員太多,我想加上一個count屬性標明一下。
針對上面的需求,在group裡面還是很好辦到的,因為group有這麼兩個選擇性參數: condition 和 finalize
condition: 這個就是過濾條件。
finalize:這是個函數,每一組文檔執行完後,多會觸發此方法,那麼在每組集合裡面加上count也就是它的活了
db.person.group(
{"key":{"age":true},
"initial":{"person":[]},
"reduce":function(doc,out){
out.person.push(doc.name);
},
"finalize":function(out){
out.count=out.person.length;
},
"condition":{"age":{$lt:25}}
})
<4> mapReduce
這玩意算是彙總函式中最複雜的了,不過複雜也好,越複雜就越靈活。
mapReduce其實是一種編程模型,用在分散式運算中,其中有一個“map”函數,一個”reduce“函數
① map:這個稱為映射函數裡面會調用emit(key,value),集合會按照你指定的key進行映射分組
② reduce:這個稱為簡化函數,會對map分組後的資料進行分組簡化,注意:在
reduce(key,value)中的key就是emit中的key,vlaue為emit分組後的emit(value)的集合,
這裡也就是很多{"count":1}的數組
③ mapReduce:這個就是最後執行的函數了,參數為map,reduce和一些選擇性參數
遊標
mongodb裡面的遊標有點類似我們說的C#裡面順延強制,比如:
var list=db.person.find();
針對這樣的操作,list其實並沒有擷取到person中的文檔,而是申明一個“查詢結構”,等我們需要的時候通過
for或next()一次性載入過來,然後讓遊標逐行讀取,當我們枚舉完了之後,遊標銷毀,之後我們在通過
list擷取時發現沒有資料返回了
var list =db.person.find();
list.forEach(function(x){
print(x.name);
})
--上面代碼執行完後,你在執行list,發現list中已經沒有資料了;
當然我們的“查詢構造”還可以搞的複雜點,比如分頁,排序都可以加進去
var single=db.person.find().sort({"name",1}).skip(2).limit(2);
那麼這樣的“查詢構造”可以在我們需要執行的時候執行,大大提高了不必要的花銷
四、mongoDB第四篇:索引的基本操作
我們日常做開發都避免不了要對程式進行效能最佳化,而程式的操作無非就是CURD,
通常我們又會花費50%的時間在R上面,因為Read操作對使用者來說是非常敏感的,處
理不好就會被人唾棄,呵呵.從演算法上來說有5種經典的尋找,這其中就包括我們今天
所說的“索引尋找”,如果大家對oracle比較瞭解的話,相信索引尋找能給我們帶來什麼
樣的效能提升吧。我們首先插入10w資料,說話:
db.person.remove()
for(var i=0;i<100000;i++){
var rand=parseInt(i*Math.random());
db.person.insert({"name":"lxg"+i,"age":i});
}
(1)效能分析函數(explain)
好了,資料已經插入成功,既然我們要做分析,肯定要有分析的工具,幸好mongodb中
給我們提供了一個關鍵字叫做“explain",那麼怎麼用呢?還是看圖,注意,這裡的name
欄位沒有建立任何索引,這裡我就查詢一個“name10000”的姓名。
db.person.find({"name":"lxg"+10000}).explain()
結果:
{
"cursor":"BasicCursor",
"nscanned":100000,
"nscanedObjects":100000,
"n":1,
"millis":114
}
仔細看紅色地區,有幾個我們關心的key。
cursor: 這裡出現的是”BasicCursor",什麼意思呢,就是說這裡的尋找採用的是“表掃描”,
也就是順序尋找,很悲催啊。
nscanned: 這裡是10w,也就是說資料庫瀏覽了10w個文檔,很恐怖吧,這樣玩讓人受不了
n: 這裡是1,也就是最終返回了1個文檔。
millis: 這個就是我們最最最....關心的東西,總共耗時114毫秒。
(2)建立索引(ensureIndex)
在10w條這麼簡單的集合中尋找一個文檔要114毫秒有一點點讓人不能接收,好,那麼我們
該如何最佳化呢?mongodb中給我們帶來了索引尋找,看看能不能讓我們的查詢一飛衝天.
db.person.ensureIndex({"name":1})
db.person.find({"name":"lxg"+100000}).explain()
結果:
{
"cursor":"BtreeCursor name_1",
"nscanned":1,
"nscannedObjects":1,
"n":1,
"millis":1
"nYields":0
}
這裡我們使用了ensureIndex在name上建立了索引。
”1“:表示按照name進行升序,”-1“:表示按照name進行降序。
我的神啊,再來看看這些敏感資訊。
cursor: 這裡出現的是”BtreeCursor",牛,mongodb採用B樹的結構來存放索引,索引名為“name_1"
nscanned: 我擦,資料庫只瀏覽了一個文檔就OK了。
n: 直接定位返回。
millis: 看看這個時間真的不敢相信,秒秒殺。
(3)唯一索引
和sqlserver一樣可以建立唯一索引,重複的索引值自然就不能插入,在mongodb中的使用方法是:
db.person.ensureIndex({"name":1},{"unique":true})
(4)複合式索引
有時候我們的查詢不是單條件的,可能是多條件,比如尋找出生在‘1989-3-2’名字叫‘jack’的同學,
那麼我們可以建立“姓名”和"生日“的聯合索引來加速查詢
db.person.ensureIndex({"name":1,"birthday":1})
db.person.ensureIndex({"birthday":1,"name":1})
看,大家或者也知道name跟birthday的不同,建立的索引也不同,升序和降序的順序不同
都會產生不同的索引,那麼我們可以用getIndexes來查看下person集合中到底產生了那些索引。
db.person.getIndexes()
此時我們肯定很好奇,到底查詢最佳化工具會使用哪個查詢作為操作,呵呵,還是看看
db.person.find({"birthday":"1989-3-2","name":"jack"}).explain()
看完我們要相信查詢最佳化工具,它給我們做出的選擇往往是最優的,因為我們做查詢時,查
詢最佳化器會使用我們建立的這些索引來建立查詢方案
MongoDB的Hints
如果某一個先執行完則其他查詢方案被close掉,這種方案會被mongodb儲存起來,
當然如果非要用自己指定的查詢方案,這也是可以的,在mongodb中給我們提供
了hint方法讓我們可以暴力執行
db.person.find({"birthday":"1989-3-2","name":"jack"})
.hint({"birthday":1,"name":1}).explain()
刪除索引
可能隨著業務需求的變化,原先建立的索引可能沒有必要了,索引會降低CUD這三
種操作的效能,因為idex需要即時維護,所以問題要綜合考慮,這裡就把剛才建立的索
引清掉來示範一下:dropIndexes的使用
db.person.dropIndexes("name_1")
db.person.dropIndexes("name_1_birthday_1")
db.person.dropIndexes("birthday_1_name_1")
db.person.getIndexes()
五、mongoDB第五篇:JAVA的基本操作
引入jar
org.mongodb.mongo-java-driver
com.google.code.gson.Gson
protected void _insert(Object insertObject){
DBCollection collection=getCollection();
if(collection==null){
return;
}
collection.insert(insertObject);
}
建立SimpleTest.java,完成簡單的mongoDB資料庫操作
Mongo mongo = new Mongo();
這就建立了一個MongoDB的資料庫連接對象,它預設串連到當前機器的localhost地址,連接埠是27017。
DB db = mongo.getDB(“test”);
這樣就獲得了一個test的資料庫,如mongoDB中沒有建立這個資料庫也是可以正常啟動並執行,mongoDB可以
在沒有建立這個資料庫的情況下,完成資料的添加操作,當添加的時候,沒有這個庫,mongoDB會自動創
建當前資料庫。得到了db,下一步我們要擷取一個“聚集集合DBCollection”,通過db對象的getCollection
方法來完成。DBCollection users = db.getCollection("users");
這樣就獲得了一個DBCollection,它相當於我們資料庫的“表”。
查詢所有資料
DBCursor cur = users.find();
while (cur.hasNext()) {
System.out.println(cur.next());
}
六、相關文檔
http://blog.csdn.net/liuzhoulong/article/category/774845
http://book.51cto.com/art/201211/363567.htm
http://www.cnblogs.com/hoojo/archive/2011/06/02/2068665.html --java操作
七、mongoDB最新版本3.0
Mongo是拉丁文humongous:巨大,大資料
MongoDB是什嗎?開來源資料庫,OLTR定位通用資料庫,它靈活的文檔
mongoDB總部在美國紐約矽谷
最大特點:
文檔模型{JSON},靈活自然的文檔
用戶端---》伺服器---》》資料庫,三層之間傳遞的資料都是json文檔模型
維護開發都很方便
mongoDB部署時,要求配置叢集,至少一主二從
具體使用情境:
1) 資料持久化
2) 讀寫分離
3) 容災---》金融行業
具體使用情境:
MongoDB3.0特性
寫效能up 7-10%
壓縮 30-80%
營運up opsManagers,
3.0引入wiredTiger引擎,無鎖的並發控制
2.6之前的版本只有一種儲存引擎,之後有多種引擎---》不同引擎有不同的側重點,根據需求進行選擇;如有側重讀的,有側重寫的,還有側重緩衝的。。。
效能指標:並發量和相應延遲
高並發寫:是3.0的一大特點;引用情境,物聯網應用,比如國外賣車險時,會提供一個用戶端軟體,插入車上,你的即時資訊都會反饋給保險公司,會對你的行為進行分析,若果你安裝了,就優惠30%;所以在國外,相同款的車,可能保費相差甚遠;這些資料都是即時反饋到大資料中心的;
需要根據需求進行選擇
異構,半結構/無結構資料,海量資料,高並發量,弱事務
1)異構:比如多套系統要進行合并,各個DB模型都不相同,如何合并能,使用document模型
mongoDB入門篇