MongoDB基礎部分及實現(一)

MongoDB基礎部分及實現(一)

 

MongoDB是由C++語言所編寫的一種面向文檔的非關係型數據庫(是一種NoSql數據庫實現),也是介於關係型數據庫和非關係型數據庫之間的數據存儲產品,其提供了高性能、高可用、高可拓展及基於分佈式存儲的數據庫,是非關係型數據庫中功能最豐富,最類似關係型數據庫的一種集合、文檔格式的數據庫。

 

l   優點區別

l   數據模型

l   數據操作

l   語言拓展

 

一、優點區別

A、數據存儲格式不同,MongoDB採用文檔形式存儲數據(JSON),而RDBMS則是數據表格式;

B、採用鍵-值對形式存儲數據,性能高於RDBMS的表檢索性能;

C、不存在複雜的數據結構連接操作;

D、易於拓展規模化;

E、不需要RDBMS數據庫對象的應用程序轉換和映射;

F、對任何屬性內容可索引;

G、複製、自動分片及快速更新數據的能力;

 

一般情況,我們會在企業大數據情景或是數據庫數據量很大時候,使用MongoDB數據庫存儲,利用其本身的數據存儲優勢,來提高數據存儲的性能、拓展及高可用。

 

二、數據模型

在這裏,我們以帖子、帖子評論及帖子標籤爲例來說明在RDBMS和MongoDB的區別,目的只爲說明後者的方便性,不需要複雜的關聯關係。

對於關係型數據庫,若實現上面的例子,至少需要三張數據表纔可以實現該需求,具體的數據表ER圖如下:

 

而使用MongoDB實現就比較簡單,只需要將comment和tag_list嵌入post即可,不需要創建多個文檔,僅僅一個post文檔即可描述清楚,具體如下鍵值對格式數據:

 

{

   _id: POST_ID

   title: TITLE_OF_POST,

   desc: POST_DESCRIPTION,

   by: POST_BY,

   url: URL_OF_POST,

   tags:[TAG1, TAG2, TAG3],

   likes: TOTAL_LIKES,

   comments:[   

      {

         user:'COMMENT_BY',

         content: TEXT,

         time: DATE_TIME,

         like: LIKES

      },

      {

         user:'COMMENT_BY',

         content: TEXT,

         time: DATE_TIME,

         like: LIKES

      }

   ]

}

 

三、數據操作

1、數據庫操作

A、創建數據庫

> use mydb

switched to db mydb

 

B、查詢當前數據庫

> db

mydb

 

C、查看數據庫列表

> show dbs

local    0.000GB

test     0.000GB

 

由於新建的數據庫mydb中沒有數據,默認是不顯示的,所以我們插入一個文件:

> db.movie.insert({"name":"cloud waterteam using!"})

WriteResult({"nInserted" : 1 })

再次使用show dbs,即可看到新建數據庫:

> show dbs

local    0.000GB

mydb     0.000GB

test     0.000GB

 

D、刪除數據庫

> db.dropDatabase()

{ "dropped" :"mydb", "ok" : 1 }

查看下列表,看是否刪除:

> show dbs

local    0.000GB

test     0.000GB

 

2、CURD操作

在MongoDB中,數據的CURD操作是針對集合而言,也就是文檔的增、刪、改及查詢操作是在所屬集合中進行,具體如下:

A、新建集合

> db.createCollection("mycollection")

{ "ok" : 1 }

新建之後,查詢下是否創建完成:

> show collections

mycollection

 

注意:

在MongoDB中,可以不顯示的創建集合,因爲系統會自動創建集合,比如:當我們使用db.COLLECTION_NAME.insert({…})時會自動新建或是打開存在的集合,另外,我們也可以在創建集合的同時插入文檔到改集合,格式語法如下:

db.cteateCollection(“COLLECTION_NAME”,{…})

 

B、刪除集合

> db.mycollection.drop()

true

 

查詢是否刪除集合成功:

> show collections

 

C、插入文檔

> db.post.insert([{title:'MongoDB 000',desc:'MongoDBis one of  nosqldatabase',by:'cwteam',url:'www.baidu.com',tags:['mongodb','nosql','database'],likes:10000},{title:'MongoDB001',desc:'Nosql db has no tables,younknow?',by:'cwteam',url:'www.baidu.com',tags:['mongodb','nosql','database'],likes:20000,comments:[{user:'cwteam',content:'thefirst comment',time:new Date(2016,09,19,18,10),like:0}]}])

BulkWriteResult({

     "writeErrors": [ ],

     "writeConcernErrors": [ ],

     "nInserted": 2,

     "nUpserted": 0,

     "nMatched": 0,

     "nModified": 0,

     "nRemoved": 0,

     "upserted": [ ]

})

新建了一個post集合,並插入兩條記錄(評論及標籤)。

 

D、查詢文檔

非格式化查詢:

> db.post.find()

{ "_id" :ObjectId("57dfb9a633c51cdbe23b798a"), "title" :"MongoDB 000", "desc" : "MongoDB is one of  nosql database", "by" :"cwteam", "url" : "www.baidu.com","tags" : [ "mongodb", "nosql", "database"], "likes" : 10000 }

{ "_id" :ObjectId("57dfb9a633c51cdbe23b798b"), "title" :"MongoDB 001", "desc" : "Nosql db has no tables,younknow?", "by" : "cwteam", "url" :"www.baidu.com", "tags" : [ "mongodb","nosql", "database" ], "likes" : 20000, "comments": [ { "user" : "cwteam", "content" : "thefirst comment", "time" :ISODate("2016-10-19T10:10:00Z"), "like" : 0 } ] }

 

格式化查詢:

> db.post.find().pretty()

{

     "_id": ObjectId("57dfb9a633c51cdbe23b798a"),

     "title": "MongoDB 000",

     "desc": "MongoDB is one of  nosqldatabase",

     "by": "cwteam",

     "url": "www.baidu.com",

     "tags": [

         "mongodb",

         "nosql",

         "database"

     ],

     "likes": 10000

}

{

     "_id": ObjectId("57dfb9a633c51cdbe23b798b"),

     "title": "MongoDB 001",

     "desc": "Nosql db has no tables,youn know?",

     "by": "cwteam",

     "url": "www.baidu.com",

     "tags": [

         "mongodb",

         "nosql",

         "database"

     ],

     "likes": 20000,

     "comments": [

         {

              "user": "cwteam",

              "content": "the first comment",

              "time": ISODate("2016-10-19T10:10:00Z"),

              "like": 0

         }

     ]

}

 

E、修改文檔

 

更新現有文檔:

>db.post.update({'_id':ObjectId("57dfb9a633c51cdbe23b798b")},{$set:{'url':'www.cwteam.com'}})

查看下更新的結果:

{

     "_id": ObjectId("57dfb9a633c51cdbe23b798b"),

     "title": "MongoDB 001",

     "desc": "Nosql db has no tables,youn know?",

     "by": "cwteam",

     "url": "www.cwteam.com",

     "tags": [

         "mongodb",

         "nosql",

         "database"

     ],

     "likes": 20000,

     "comments": [

         {

              "user": "cwteam",

              "content": "the first comment",

              "time": ISODate("2016-10-19T10:10:00Z"),

              "like": 0

         }

     ]

}

 

注意:

如果要修改多個文檔,可以這樣操作:

>db.post.update({'_id':ObjectId("57dfb9a633c51cdbe23b798b")},{$set:{'url':'www.cwteam.com'},{multi:true})

 

 

 

替換現有文檔:

>db.post.save({'_id':ObjectId("57dfb9a633c51cdbe23b798a"),'title':'hellowmongodb','by':'cwteam'})

WriteResult({"nMatched" : 1, "nUpserted" : 0, "nModified" : 1})

查看下替換的結果:

{

     "_id": ObjectId("57dfb9a633c51cdbe23b798a"),

     "title": "hellow mongodb",

     "by": "cwteam"

}

 

F、刪除文檔

刪除一個文檔(1限定刪除第一個文檔):

> db.post.remove({},1)

WriteResult({"nRemoved" : 1 })

如果要隨意刪除任何一個文檔,只需要下面操作:

> db.post.remove({"_id":ObjectId("57dfb9a633c51cdbe23b798a")})

 

刪除所有文檔:

> db.post.remove({})

WriteResult({ "nRemoved" : 1 })

 

3、備份還原

備份操作:

sudo ./mongodump -h 127.0.0.1:27017 -d mydb -o../data/backup

 

還原操作:

sudo ./mongorestore -h127.0.0.1:27017 -d mydb -dir ../data/backup/mydb

 

 

四、語言拓展

語言拓展指的是如何將MongoDB與開發語言結合,實現彼此的順利通信交互,實際上就是調用相關的對外api來訪問和操作MongoDB,下面就以在PHP和Java中如何使用其進行說明。

1、在PHP的使用

在PHP中使用MongoDB數據庫,我們必須爲其添加MongoDB驅動拓展,並在php.ini文件中將該拓展嵌入到PHP環境中,如下所示:

extension=php_mongo.so/.dll(後綴類型根據系統環境而不同,linux/unix/mac 爲.so,而windows則爲.dll)。

A、下載及安裝

這裏我們通過pecl軟件集工具在線安裝mongo驅動,具體如下:

$sudo pecl install mongo

 

B、拓展及配置

我們將上面安裝之後生成的mongo.so文件路徑添加到php.ini中,如下:

extension=mongo.so

 

注意:

更新php.ini配置文件後,必須重啓web服務才能生效修改的配置信息。

 

C、驗證及使用

首先,我們驗證下mongodb驅動是否添加完成:

<?php
phpinfo();

?>

 

結果如下顯示,則說明添加完成:

 

其次,這裏演示下對其的增、查操作:

連接並選擇數據庫:

// 連接到數據庫
$m = new MongoClient("test.mongodb.com:27017");
// 選擇一數據庫
$db = $m->mydb;

選擇一個集合:

// 連接到數據庫
$m = new MongoClient();
// 選擇一數據庫
$db = $m->mydb;

插入一個文檔,並在命令行模式下查看結果:


// 插入一個文檔
$document = array(
    "title" => "MongoDB",
    "desc" => "database",
    "likes" => 100000,
    "url" => "http://www.cwteam.com",
    "by" => "cwteam.com"
);
$collections->insert($document);

結果顯示:

 

查詢指定集合所有文檔,並在瀏覽器查看結果:

// 查詢所有文檔
$cursors = $collections->find();
foreach($cursors as $document) {
    echo 'title:'.$document["title"].'</br>';
    echo 'desc:'.$document['desc'].'</br>';
    echo 'likes:'.$document['likes'].'</br>';
    echo 'url:'.$document['url'].'</br>';
    echo 'by:'.$document['by'].'</br>';
}

結果顯示:

    

 

好了,經過以上的過程,我們已經成功完成在php中使用mongodb的介紹,因爲mongodb在php中的使用與命令行模式相同,這裏不再介紹。

 

2、在Java的使用

在Java環境中使用Mongodb數據庫,我們需要爲其classpath添加mongo.jar文件。這裏我們同樣以PHP的例子爲例說明,我們新建一個java項目,並使用mongo.jar提供的api來操作mongo.jar,具體如下:

A、下載軟件包

官網地址:

https://docs.mongodb.com/ecosystem/drivers/java/

 

 

B、驗證及使用

這裏使用的版本爲mongo-java-driver-2.10.1.jar,我們只需要將其導入到java項目即可使用,具體如下:

連接並選擇一個數據庫:

// 連接並選擇數據庫

               MongoClientmogoClient = new MongoClient("test.mongodb.com",27017);

               DB mydb = mogoClient.getDB("mydb");

 

獲得一個集合:

// 獲取一個集合

               DBCollection collecs = mydb.getCollection("post");

 

插入一個文檔,並在命令行模式下查看結果:

// 插入一個文檔

               BasicDBObjectdoc = new BasicDBObject();

               doc.append("title", "MongoDB-Java");

               doc.append("desc", "database");

               doc.append("likes", 300000);

               doc.append("url", "test.mongodb.com");

               doc.append("by", "cwteam.com");

               collecs.insert(doc);

結果顯示:

 

查詢所有文檔,並在輸出查看日誌打印結果:

// 查找所有文檔

               DBCursordbCursor = collecs.find();

               List<DBObject>objs = dbCursor.toArray();

               for(DBObject dobj : objs) {

                     log(dobj.toString());

               }

結果顯示:

 

 

 

 

 

 

好了,Mongodb基礎部分就介紹到這裏,由於作者水平有限,如有問題請在評論發言討論,謝謝。

 

 

 

 

技術討論羣:

276592700(新)

發佈了132 篇原創文章 · 獲贊 164 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章