mongoDB入門篇

來源:互聯網
上載者:User

標籤: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

  • TJ:唐建法,mongoDB方案架構師

     Mongo是拉丁文humongous:巨大,大資料

     MongoDB是什嗎?開來源資料庫,OLTR定位通用資料庫,它靈活的文檔

     mongoDB總部在美國紐約矽谷

 最大特點:

 文檔模型{JSON},靈活自然的文檔

 用戶端---》伺服器---》》資料庫,三層之間傳遞的資料都是json文檔模型

 維護開發都很方便

 

  • 高可用的複製叢集replicaSet

mongoDB部署時,要求配置叢集,至少一主二從

  具體使用情境:

    1)  資料持久化

    2)  讀寫分離

    3)  容災---》金融行業

 

  • 水平擴充的分區叢集:將資料分為多個片shard,每一個片為一個資料庫

  具體使用情境:

  • 效能擴充:新一代大資料應用需求,解決高並發量問題

  • 地理位置分布

  • 快速恢複:比如一個項目代表或檔案非常大,如果以檔案的形式進行複製,複製是相當慢的;如果將其分成多個片進行儲存到mongoDB中,回複時就可以用多線程的方式進行恢複;

 

  • MongoDB3.0特性

  • 寫效能up 7-10%

  • 壓縮 30-80%

  • 營運up   opsManagers,

  • 3.0引入wiredTiger引擎,無鎖的並發控制

  • 2.6之前的版本只有一種儲存引擎,之後有多種引擎---》不同引擎有不同的側重點,根據需求進行選擇;如有側重讀的,有側重寫的,還有側重緩衝的。。。

  • 效能指標:並發量和相應延遲

  • 高並發寫:是3.0的一大特點;引用情境,物聯網應用,比如國外賣車險時,會提供一個用戶端軟體,插入車上,你的即時資訊都會反饋給保險公司,會對你的行為進行分析,若果你安裝了,就優惠30%;所以在國外,相同款的車,可能保費相差甚遠;這些資料都是即時反饋到大資料中心的;

 

  • MongoDB的壓縮

  • 預設使用SNAPPY進行壓縮,壓縮率不高,但速度快

  • Zlib:壓縮率高,用時多些

需要根據需求進行選擇

 

  • mongoDB使用哪些情境:

異構,半結構/無結構資料,海量資料,高並發量,弱事務

1)異構:比如多套系統要進行合并,各個DB模型都不相同,如何合并能,使用document模型

mongoDB入門篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.