天天看點

NoSQL(3)

1、什麼是MongoDB ?

MongoDB 是由C++語言編寫的,是一個基于分布式檔案存儲的開源資料庫系統。

在高負載的情況下,添加更多的節點,可以保證伺服器性能。

MongoDB 旨在為WEB應用提供可擴充的高性能資料存儲解決方案。

MongoDB 将資料存儲為一個文檔,資料結構由鍵值(key=>value)對組成。

MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。

2、MongoDB特性

MongoDB是一個可擴充、高性能的下一代資料庫,它的特點是高性能、易部署、易使用、存儲數 據友善,主要特性有:

• 面向文檔存儲,json格式的文檔易讀、高效;

• 模式自由,支援動态查詢、完全索引,無模式;

• 高效的資料存儲,效率提高;

• 支援複制和故障恢複;

• 以支援雲級别的伸縮性,支援水準資料庫叢集,可動态添加額外伺服器;

3、MongoDB的工作方式

傳統的關系型資料庫一般有資料庫(database)、表(table)、記錄(record)三級層次構成。

MongoDB同樣是由資料庫(database)、集合(collection)、文檔對象(documen)三個層次組 成。

文檔 類似于json的鍵值對。{"name":"tom","age":23} 集合 一組文檔的集合。

4、MongoDB局限與不足

32位系統上,不支援大于2.5G的資料。

單個文檔大小限制為16M。

鎖粒度太粗,MongoDB使用一把全局讀寫鎖。

不支援join操作和事務機制 對記憶體要求比較大,至少要保證熱資料(索引,資料及系統其他開銷)都能裝進記憶體

使用者權限方面較弱 MapReduce在單個執行個體上無法運作,可用Auto-Sharding實作,是由JS引擎限制造成。

MapReduce的結果無法寫入到一個被Sharding的collection中,待後續版本解決

對于數組型的資料操作不夠豐富

1、使用yum線上安裝MongoDB 

配置yum源

NoSQL(3)

[mongodb-enterprise]

name=MongoDB Enterprise Repository

baseurl=https://repo.mongodb.com/yum/redhat/$releasever/mongodb-enterprise/4.2/$basearch/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

NoSQL(3)
NoSQL(3)

[[email protected] yum.repos.d]# yum list | grep -i mongodb

NoSQL(3)

重點關注:libmysqlclient.so.18()(64bit)

解決:

缺少Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm這個包

# wget http://www.percona.com/redir/downloads/Percona-XtraDB-Cluster/5.5.37-25.10/RPM/rhel6/x86_64/Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm

# rpm -ivh Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm 

NoSQL(3)

我們下載下傳完後,啟動服務就行了。這也太慢了

2、源碼安裝MongoDB并配置服務腳本 

下載下傳軟體包:

連結:https://pan.baidu.com/s/1GfDaKYbaKBK5xHln8qspMg 

提取碼:yang 

NoSQL(3)

解壓:

tar xf mongodb-linux-x86_64-rhel70-3.4.7.tgz  -C /usr/local/

NoSQL(3)

建立資料目錄:

NoSQL(3)

啟動:

NoSQL(3)

echo "export PATH=$PATH:/usr/local/mongodb/bin" > /etc/profile.d/mongo.sh

NoSQL(3)

source /etc/profile.d/mongo.sh

NoSQL(3)

mongod --dbpath /data/db/ &

NoSQL(3)

 ps -ef | grep mongod

NoSQL(3)

netstat -lnupt | grep 27017

NoSQL(3)

lsof -i tcp:27017

NoSQL(3)
NoSQL(3)

以系統服務方式啟動:(服務腳本沒有成功,有待修正)

建立配置檔案mongod.conf

vim /usr/local/mongodb/bin/mongod.conf

systemLog:

destination: file 

path: /usr/local/mongodb/log/mongodb.log 

logAppend: true

storage:

dbPath: /usr/local/mongodb/data 

processManagement:

fork: true 

按配置檔案設定建立日志和資料檔案存放目錄:

[[email protected] ~]# mkdir -p /usr/local/mongodb/{data,log}

NoSQL(3)

配置mongodb.service檔案

vim /usr/lib/systemd/system/mongodb.service

[Unit]

Description=mongodb service daemon

After=network.target

[Service]

Type=forking

ExecStart=/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongod.conf

ExecStop=/usr/local/mongodb/bin/mongod --shutdown -f  /usr/local/mongodb/bin/mongod.conf

PrivateTmp=true

[Install]

WantedBy=multi-user.target

NoSQL(3)

儲存mongodb.service檔案後,需要輸入指令進行重新加載.

3、基本操作作業 

1)建立一個資料庫 名字grade 

use grade

NoSQL(3)

2)資料庫中建立一個集合名字 class 

db.createCollection('class')

NoSQL(3)

3)集合中插入若幹資料 文檔格式如下 {name:'zhang',age;10,sex:'m',hobby:['a','b','c']} hobby: draw sing dance basketball football pingpong computer 

NoSQL(3)

自行插入資料,後面查詢使用 

4)查詢操作 

檢視班級所有人資訊 

db.class.find()

NoSQL(3)

檢視班級中年齡為8歲的學生資訊 

db.class.find({age:8})

NoSQL(3)

檢視年齡大于10歲的學生資訊 

db.class.find({age:{$gt:10}})

NoSQL(3)

檢視年齡在 4---8歲之間的學生資訊 

db.class.find({age:{$gt:4,$lt:8}})

NoSQL(3)

找到年齡為6歲且為男生的學生 

db.class.find({age:6,sex:'m'})

NoSQL(3)

找到年齡小于7歲或者大于10歲的學生 

db.class.find({$or:[{age:{$gt:10}},{age:{$lt:7}}]})

NoSQL(3)

找到年齡是8歲或者11歲的學生 

db.class.find({age:{$in:[8,11]}})

NoSQL(3)

找到興趣愛好有兩項的學生 

db.class.find({hobby:{$size:2}})

NoSQL(3)

找到興趣愛好有draw的學生 

db.class.find({hobby:"draw"})

NoSQL(3)

找到既喜歡畫畫又喜歡跳舞的學生 

db.class.find({hobby:{$all:['draw','dance']}})

NoSQL(3)

統計愛好有三項的學生人數 

 db.class.find({hobby:{$size:3}}).count()

NoSQL(3)

找出本班年齡第二大的學生 

db.class.find({}).sort({age:-1}).skip(1).limit(1)

NoSQL(3)

檢視學生的興趣範圍 

db.class.distinct('hobby')

NoSQL(3)

将學生按年齡排序找到年齡最大的三個 

db.class.find({}).sort({age:-1}).limit(3)

NoSQL(3)

删除所有 年級大于12或者小于4歲的學生

db.class.remove({$or:[{age:{$lt:6}},{age:{$gt:12}}]})

NoSQL(3)

5)增加、更新、删除、統計 

将小紅的年齡變為8歲 興趣愛好變為 跳舞 畫畫 

追加小明興趣愛好 唱歌 

小王興趣愛好增加 吹牛 打籃球 

小李增加愛好,跑步和唱歌,但是不要和以前的重複 

該班所有同學年齡加1 

删除小明的sex屬性 

删除小李興趣中的第一項 

将小紅興趣中的畫畫愛好删除 

增加分數域 score:{'chinese':88,'english':78,'math':98} 

1. 按照性别分組統計每組人數 

2. 按照姓名分組,過濾出有重名的同學 

3. 統計每名男生的國文成績 

4. 将女生按照英語分數降序排列

未完待續