MongoDB基礎(chǔ)部份及實(shí)現(xiàn)(1)
MongoDB是由C++語(yǔ)言所編寫(xiě)的1種面向文檔的非關(guān)系型數(shù)據(jù)庫(kù)(是1種NoSql數(shù)據(jù)庫(kù)實(shí)現(xiàn)),也是介于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)之間的數(shù)據(jù)存儲(chǔ)產(chǎn)品,其提供了高性能、高可用、高可拓展及基于散布式存儲(chǔ)的數(shù)據(jù)庫(kù),是非關(guān)系型數(shù)據(jù)庫(kù)中功能最豐富,最類似關(guān)系型數(shù)據(jù)庫(kù)的1種集合、文檔格式的數(shù)據(jù)庫(kù)。
l 優(yōu)點(diǎn)區(qū)分
l 數(shù)據(jù)模型
l 數(shù)據(jù)操作
l 語(yǔ)言拓展
1、優(yōu)點(diǎn)區(qū)分
A、數(shù)據(jù)存儲(chǔ)格式不同,MongoDB采取文檔情勢(shì)存儲(chǔ)數(shù)據(jù)(JSON),而RDBMS則是數(shù)據(jù)表格式;
B、采取鍵-值對(duì)情勢(shì)存儲(chǔ)數(shù)據(jù),性能高于RDBMS的表檢索性能;
C、不存在復(fù)雜的數(shù)據(jù)結(jié)構(gòu)連接操作;
D、易于拓展范圍化;
E、不需要RDBMS數(shù)據(jù)庫(kù)對(duì)象的利用程序轉(zhuǎn)換和映照;
F、對(duì)任何屬性內(nèi)容可索引;
G、復(fù)制、自動(dòng)分片及快速更新數(shù)據(jù)的能力;
1般情況,我們會(huì)在企業(yè)大數(shù)據(jù)情形或是數(shù)據(jù)庫(kù)數(shù)據(jù)量很大時(shí)候,使用MongoDB數(shù)據(jù)庫(kù)存儲(chǔ),利用其本身的數(shù)據(jù)存儲(chǔ)優(yōu)勢(shì),來(lái)提高數(shù)據(jù)存儲(chǔ)的性能、拓展及高可用。
2、數(shù)據(jù)模型
在這里,我們以帖子、帖子評(píng)論及帖子標(biāo)簽為例來(lái)講明在RDBMS和MongoDB的區(qū)分,目的只為說(shuō)明后者的方便性,不需要復(fù)雜的關(guān)聯(lián)關(guān)系。
對(duì)關(guān)系型數(shù)據(jù)庫(kù),若實(shí)現(xiàn)上面的例子,最少需要3張數(shù)據(jù)表才可以實(shí)現(xiàn)該需求,具體的數(shù)據(jù)表ER圖以下:
而使用MongoDB實(shí)現(xiàn)就比較簡(jiǎn)單,只需要將comment和tag_list嵌入post便可,不需要?jiǎng)?chuàng)建多個(gè)文檔,僅僅1個(gè)post文檔便可描寫(xiě)清楚,具體以下鍵值對(duì)格式數(shù)據(jù):
{
_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
}
]
}
3、數(shù)據(jù)操作
1、數(shù)據(jù)庫(kù)操作
A、創(chuàng)建數(shù)據(jù)庫(kù)
> use mydb
switched to db mydb
B、查詢當(dāng)前數(shù)據(jù)庫(kù)
> db
mydb
C、查看數(shù)據(jù)庫(kù)列表
> show dbs
local 0.000GB
test 0.000GB
由于新建的數(shù)據(jù)庫(kù)mydb中沒(méi)有數(shù)據(jù),默許是不顯示的,所以我們插入1個(gè)文件:
> db.movie.insert({"name":"cloud waterteam using!"})
WriteResult({"nInserted" : 1 })
再次使用show dbs,便可看到新建數(shù)據(jù)庫(kù):
> show dbs
local 0.000GB
mydb 0.000GB
test 0.000GB
D、刪除數(shù)據(jù)庫(kù)
> db.dropDatabase()
{ "dropped" :"mydb", "ok" : 1 }
查看以下表,看是不是刪除:
> show dbs
local 0.000GB
test 0.000GB
2、CURD操作
在MongoDB中,數(shù)據(jù)的CURD操作是針對(duì)集合而言,也就是文檔的增、刪、改及查詢操作是在所屬集合中進(jìn)行,具體以下:
A、新建集合
> db.createCollection("mycollection")
{ "ok" : 1 }
新建以后,查詢下是不是創(chuàng)建完成:
> show collections
mycollection
注意:
在MongoDB中,可以不顯示的創(chuàng)建集合,由于系統(tǒng)會(huì)自動(dòng)創(chuàng)建集合,比如:當(dāng)我們使用db.COLLECTION_NAME.insert({…})時(shí)會(huì)自動(dòng)新建或是打開(kāi)存在的集合,另外,我們也能夠在創(chuàng)建集合的同時(shí)插入文檔到改集合,格式語(yǔ)法以下:
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": [ ]
})
新建了1個(gè)post集合,并插入兩條記錄(評(píng)論及標(biāo)簽)。
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⑴0⑴9T10: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⑴0⑴9T10:10:00Z"),
"like": 0
}
]
}
E、修改文檔
更新現(xiàn)有文檔:
>db.post.update({'_id':ObjectId("57dfb9a633c51cdbe23b798b")},{$set:{'url':'www.cwteam.com'}})
查看下更新的結(jié)果:
{
"_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⑴0⑴9T10:10:00Z"),
"like": 0
}
]
}
注意:
如果要修改多個(gè)文檔,可以這樣操作:
>db.post.update({'_id':ObjectId("57dfb9a633c51cdbe23b798b")},{$set:{'url':'www.cwteam.com'},{multi:true})
替換現(xiàn)有文檔:
>db.post.save({'_id':ObjectId("57dfb9a633c51cdbe23b798a"),'title':'hellowmongodb','by':'cwteam'})
WriteResult({"nMatched" : 1, "nUpserted" : 0, "nModified" : 1})
查看下替換的結(jié)果:
{
"_id": ObjectId("57dfb9a633c51cdbe23b798a"),
"title": "hellow mongodb",
"by": "cwteam"
}
F、刪除文檔
刪除1個(gè)文檔(1限定刪除第1個(gè)文檔):
> db.post.remove({},1)
WriteResult({"nRemoved" : 1 })
如果要隨便刪除任何1個(gè)文檔,只需要下面操作:
> 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
4、語(yǔ)言拓展
語(yǔ)言拓展指的是如何將MongoDB與開(kāi)發(fā)語(yǔ)言結(jié)合,實(shí)現(xiàn)彼此的順利通訊交互,實(shí)際上就是調(diào)用相干的對(duì)外api來(lái)訪問(wèn)和操作MongoDB,下面就以在PHP和Java中如何使用其進(jìn)行說(shuō)明。
1、在PHP的使用
在PHP中使用MongoDB數(shù)據(jù)庫(kù),我們必須為其添加MongoDB驅(qū)動(dòng)拓展,并在php.ini文件中將該拓展嵌入到PHP環(huán)境中,以下所示:
extension=php_mongo.so/.dll(后綴類型根據(jù)系統(tǒng)環(huán)境而不同,linux/unix/mac 為.so,而windows則為.dll)。
A、下載及安裝
這里我們通過(guò)pecl軟件集工具在線安裝mongo驅(qū)動(dòng),具體以下:
$sudo pecl install mongo
B、拓展及配置
我們將上面安裝以后生成的mongo.so文件路徑添加到php.ini中,以下:
extension=mongo.so
注意:
更新php.ini配置文件后,必須重啟web服務(wù)才能生效修改的配置信息。
C、驗(yàn)證及使用
首先,我們驗(yàn)證下mongodb驅(qū)動(dòng)是不是添加完成:
<?php
phpinfo();
?>
結(jié)果以下顯示,則說(shuō)明添加完成:
其次,這里演示下對(duì)其的增、查操作:
連接并選擇數(shù)據(jù)庫(kù):
選擇1個(gè)集合:
插入1個(gè)文檔,并在命令行模式下查看結(jié)果:
結(jié)果顯示:
查詢指定集合所有文檔,并在閱讀器查看結(jié)果:
結(jié)果顯示:
好了,經(jīng)過(guò)以上的進(jìn)程,我們已成功完成在php中使用mongodb的介紹,由于mongodb在php中的使用與命令行模式相同,這里不再介紹。
2、在Java的使用
在Java環(huán)境中使用Mongodb數(shù)據(jù)庫(kù),我們需要為其classpath添加mongo.jar文件。這里我們一樣以PHP的例子為例說(shuō)明,我們新建1個(gè)java項(xiàng)目,并使用mongo.jar提供的api來(lái)操作mongo.jar,具體以下:
A、下載軟件包
官網(wǎng)地址:
https://docs.mongodb.com/ecosystem/drivers/java/
B、驗(yàn)證及使用
這里使用的版本為mongo-java-driver⑵.10.1.jar,我們只需要將其導(dǎo)入到j(luò)ava項(xiàng)目便可使用,具體以下:
連接并選擇1個(gè)數(shù)據(jù)庫(kù):
// 連接并選擇數(shù)據(jù)庫(kù)
MongoClientmogoClient = new MongoClient("test.mongodb.com",27017);
DB mydb = mogoClient.getDB("mydb");
取得1個(gè)集合:
// 獲得1個(gè)集合
DBCollection collecs = mydb.getCollection("post");
插入1個(gè)文檔,并在命令行模式下查看結(jié)果:
// 插入1個(gè)文檔
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);
結(jié)果顯示:
查詢所有文檔,并在輸出查看日志打印結(jié)果:
// 查找所有文檔
DBCursordbCursor = collecs.find();
List<DBObject>objs = dbCursor.toArray();
for(DBObject dobj : objs) {
log(dobj.toString());
}
結(jié)果顯示:
好了,Mongodb基礎(chǔ)部份就介紹到這里,由于作者水平有限,如有問(wèn)題請(qǐng)?jiān)谠u(píng)論發(fā)言討論,謝謝。
技術(shù)討論群:
276592700(新)
下一篇 AWT菜單: