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(新)