溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MongoDB基礎(chǔ)

發(fā)布時(shí)間:2020-07-31 21:08:27 來(lái)源:網(wǎng)絡(luò) 閱讀:10614 作者:KaliArch 欄目:MongoDB數(shù)據(jù)庫(kù)

一、概述

1.1 MongoDB概念

MongoDB 是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。在nosql數(shù)據(jù)庫(kù)里,大部分的查詢都是鍵值對(duì)(key、value)的方式。MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中最像關(guān)系數(shù)據(jù)庫(kù)的。其特征NoSQL、文檔存儲(chǔ)、Json數(shù)據(jù)模型、支持事務(wù)。

1.2 NoSQL概念

NoSQL,指的是非關(guān)系型的數(shù)據(jù)庫(kù)。NoSQL有時(shí)也稱作Not Only SQL的縮寫(xiě),是對(duì)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)管理系統(tǒng)的統(tǒng)稱。

NoSQL用于超大規(guī)模數(shù)據(jù)的存儲(chǔ)。(例如谷歌或Facebook每天為他們的用戶收集萬(wàn)億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展。

1.3 NoSQL的特征

高擴(kuò)展性:Nosql去掉了關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性,易于橫向擴(kuò)展。

高性能:Nosql通過(guò)簡(jiǎn)單的key-value方式獲取數(shù)據(jù),非??焖?。還有NoSQL的Cache是記錄級(jí)的,是一種細(xì)粒度的Cache,所以NoSQL在這個(gè)層面上來(lái)說(shuō)就要性能高很多。

靈活的數(shù)據(jù)模型:相對(duì)于關(guān)系數(shù)據(jù)庫(kù)里,增刪字段的繁瑣,NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。

高可用:NoSQL在不太影響性能的情況,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)。比如mongodb通過(guò)mongos、config server replica set,shard就可以快速配置出高可用配置。

1.4 NoSQL分類

類型部分代表特點(diǎn) 
列存儲(chǔ)

Hbase

Cassandra

Hypertable

顧名思義,是按列存儲(chǔ)數(shù)據(jù)的。最大的特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,對(duì)針對(duì)某一列或者某幾列的查詢有非常大的IO優(yōu)勢(shì)。

文檔存儲(chǔ)

MongoDB

CouchDB

文檔存儲(chǔ)一般用類似json的格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔型的。這樣也就有有機(jī)會(huì)對(duì)某些字段建立索引,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的某些功能。

key-value存儲(chǔ)

Tokyo Cabinet / Tyrant

Berkeley DB

MemcacheDB

Redis

可以通過(guò)key快速查詢到其value。一般來(lái)說(shuō),存儲(chǔ)不管value的格式,照單全收。(Redis包含了其他功能)

圖存儲(chǔ)

Neo4J

FlockDB

圖形關(guān)系的最佳存儲(chǔ)。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)來(lái)解決的話性能低下,而且設(shè)計(jì)使用不方便。

對(duì)象存儲(chǔ)

db4o

Versant

通過(guò)類似面向?qū)ο笳Z(yǔ)言的語(yǔ)法操作數(shù)據(jù)庫(kù),通過(guò)對(duì)象的方式存取數(shù)據(jù)。

xml數(shù)據(jù)庫(kù)

Berkeley DB XML

BaseX

高效的存儲(chǔ)XML數(shù)據(jù),并支持XML的內(nèi)部查詢語(yǔ)法,比如XQuery,Xpath。

1.5 MongoDB概念解析

在mongodb中基本的概念是文檔、集合、數(shù)據(jù)庫(kù),對(duì)應(yīng)與關(guān)系型數(shù)據(jù)庫(kù)如下表:

SQL術(shù)語(yǔ)/概念MongoDB術(shù)語(yǔ)/概念解釋/說(shuō)明
databasedatabase數(shù)據(jù)庫(kù)
tablecollection數(shù)據(jù)庫(kù)表/集合
rowdocument數(shù)據(jù)記錄行/文檔
columnfield數(shù)據(jù)字段/域
indexindex索引
table joins
表連接,MongoDB不支持
primary keyprimary key主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵

數(shù)據(jù)庫(kù):一個(gè)MongoDB 實(shí)例可以承載多個(gè)數(shù)據(jù)庫(kù)。它們之間可以看作相互獨(dú)立,每個(gè)數(shù)據(jù)庫(kù)都有獨(dú)立的權(quán)限控制。在磁盤(pán)上,不同的數(shù)據(jù)庫(kù)存放在不同的文件中。MongoDB 中存在以下系統(tǒng)數(shù)據(jù)庫(kù)。

  • Admin 數(shù)據(jù)庫(kù):一個(gè)權(quán)限數(shù)據(jù)庫(kù),如果創(chuàng)建用戶的時(shí)候?qū)⒃撚脩籼砑拥絘dmin 數(shù)據(jù)庫(kù)中,那么該用戶就自動(dòng)繼承了所有數(shù)據(jù)庫(kù)的權(quán)限。

  • Local 數(shù)據(jù)庫(kù):這個(gè)數(shù)據(jù)庫(kù)永遠(yuǎn)不會(huì)被負(fù)責(zé),可以用來(lái)存儲(chǔ)本地單臺(tái)服務(wù)器的任意集合。

  • Config 數(shù)據(jù)庫(kù):當(dāng)MongoDB 使用分片模式時(shí),config 數(shù)據(jù)庫(kù)在內(nèi)部使用,用于保存分片的信息。

集合:集合就是一組文檔,類似于關(guān)系數(shù)據(jù)庫(kù)中的表。集合是無(wú)模式的,集合中的文檔可以是各式各樣的。在MongoDB中集合用collections表示,每個(gè)

collection用一個(gè)名字標(biāo)識(shí),需要注意以下幾點(diǎn):

  • 名字不允許是空字符串""

  • 名字不能包含\0字符,因?yàn)樗硎久值慕Y(jié)束

  • 不能創(chuàng)建以system.開(kāi)頭的

文檔:文檔是 MongoDB 中數(shù)據(jù)的基本單位,類似于關(guān)系數(shù)據(jù)庫(kù)中的行(但是比行復(fù)雜)。多個(gè)鍵及其關(guān)聯(lián)的值有序地放在一起就構(gòu)成了文檔。

  • 文檔中的鍵/值對(duì)是有序的。

  • 文檔中的值不僅可以是在雙引號(hào)里面的字符串,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個(gè)嵌入的文檔)。

  • MongoDB區(qū)分類型和大小寫(xiě)。

  • MongoDB的文檔不能有重復(fù)的鍵。

  • 文檔的鍵是字符串。除了少數(shù)例外情況,鍵可以使用任意UTF-8字符。

二、安裝部署

2.1 配置yum安裝

配置mongodb的yum源進(jìn)行安裝

cat >/etc/yum.repos.d/mongodb.repo<<EOF
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
EOF

yum clean all && yum makecache
yum install -y mongo-10gen mongo-10gen-server

2.2 下載安裝包安裝

cd /usr/local/
wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.10.tgz            #下載軟件包
tar -zxvf mongodb-linux-x86_64-rhel62-3.4.10.tgz
ln -sv mongodb-linux-x86_64-rhel62-3.4.10 mongodb
mkdir /usr/local/mongodb/{conf,mongoData,mongoLog}                           #創(chuàng)建數(shù)據(jù),日志,配置文件目錄
touch /usr/local/mongodb/mongoLog/mongodb.log                              #創(chuàng)建日志文件
echo "export PATH=\$PATH:/usr/local/mongodb/bin">/etc/profile.d/mongodb.sh                        
source /etc/profile.d/mongodb.sh                                     #配置環(huán)境變量

命令行啟動(dòng):

mongod --httpinterface --dbpath /usr/local/mongodb/mongoData --logpath /usr/local/mongodb/mongoLog/mongodb.log --fork

將啟動(dòng)的各項(xiàng)參數(shù)寫(xiě)入配置文件啟動(dòng)

cat>/usr/local/mongodb/conf/mongodb.conf<<EOF
dbpath=/usr/local/mongodb/mongoData                    #數(shù)據(jù)存儲(chǔ)目錄
logpath=/usr/local/mongodb/mongoLog/mongodb.log                    #日志文件
logappend=true                                      # 使用追加的方式寫(xiě)日志
journal=true                    
quiet=true        
port=27017                                        #端口
maxConns=20000                                      #最大連接數(shù)
httpinterface=true                                    #開(kāi)啟web界面端口為:28017      
fork=true                                        #以守護(hù)進(jìn)程的方式運(yùn)行MongoDB
EOF

mongod -f /usr/local/mongodb/conf/mongodb.conf                          #指定配置文件啟動(dòng)

MongoDB基礎(chǔ)

2.3 mongod配置參數(shù)詳解

--quiet# 安靜輸出
--port arg# 指定服務(wù)端口號(hào),默認(rèn)端口27017
--bind_ip arg# 綁定服務(wù)IP,若綁定127.0.0.1,則只能本機(jī)訪問(wèn),不指定默認(rèn)本地所有IP
--logpath arg# 指定MongoDB日志文件,注意是指定文件不是目錄
--logappend# 使用追加的方式寫(xiě)日志
--pidfilepath arg# PID File 的完整路徑,如果沒(méi)有設(shè)置,則沒(méi)有PID文件
--keyFile arg# 集群的私鑰的完整路徑,只對(duì)于Replica Set 架構(gòu)有效
--unixSocketPrefix arg# UNIX域套接字替代目錄,(默認(rèn)為 /tmp)
--fork# 以守護(hù)進(jìn)程的方式運(yùn)行MongoDB,創(chuàng)建服務(wù)器進(jìn)程
--auth# 啟用驗(yàn)證
--cpu# 定期顯示CPU的CPU利用率和iowait
--dbpath arg# 指定數(shù)據(jù)庫(kù)路徑
--diaglog arg# diaglog選項(xiàng) 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb# 設(shè)置每個(gè)數(shù)據(jù)庫(kù)將被保存在一個(gè)單獨(dú)的目錄
--journal# 啟用日志選項(xiàng),MongoDB的數(shù)據(jù)操作將會(huì)寫(xiě)入到j(luò)ournal文件夾的文件里
--journalOptions arg# 啟用日志診斷選項(xiàng)
--ipv6# 啟用IPv6選項(xiàng)
--jsonp# 允許JSONP形式通過(guò)HTTP訪問(wèn)(有安全影響)
--maxConns arg# 最大同時(shí)連接數(shù) 默認(rèn)2000
--noauth# 不啟用驗(yàn)證
--nohttpinterface# 關(guān)閉http接口,默認(rèn)關(guān)閉27018端口訪問(wèn)
--noprealloc# 禁用數(shù)據(jù)文件預(yù)分配(往往影響性能)
--noscripting# 禁用腳本引擎
--notablescan# 不允許表掃描
--nounixsocket# 禁用Unix套接字監(jiān)聽(tīng)
--nssize arg (=16)# 設(shè)置信數(shù)據(jù)庫(kù).ns文件大小(MB)
--objcheck# 在收到客戶數(shù)據(jù),檢查的有效性,
--profile arg# 檔案參數(shù) 0=off 1=slow, 2=all
--quota# 限制每個(gè)數(shù)據(jù)庫(kù)的文件數(shù),設(shè)置默認(rèn)為8
--quotaFiles arg# number of files allower per db, requires --quota
--rest# 開(kāi)啟簡(jiǎn)單的rest API
--repair# 修復(fù)所有數(shù)據(jù)庫(kù)run repair on all dbs
--repairpath arg# 修復(fù)庫(kù)生成的文件的目錄,默認(rèn)為目錄名稱dbpath
--slowms arg (=100)# value of slow for profile and console log
--smallfiles# 使用較小的默認(rèn)文件
--syncdelay arg (=60)# 數(shù)據(jù)寫(xiě)入磁盤(pán)的時(shí)間秒數(shù)(0=never,不推薦)
--sysinfo# 打印一些診斷系統(tǒng)信息
--upgrade# 如果需要升級(jí)數(shù)據(jù)庫(kù)

 * Replicaton 參數(shù)

--fastsync# 從一個(gè)dbpath里啟用從庫(kù)復(fù)制服務(wù),該dbpath的數(shù)據(jù)庫(kù)是主庫(kù)的快照,可用于快速啟用同步
--autoresync# 如果從庫(kù)與主庫(kù)同步數(shù)據(jù)差得多,自動(dòng)重新同步,
--oplogSize arg# 設(shè)置oplog的大小(MB)

 * 主/從參數(shù)

--master# 主庫(kù)模式
--slave# 從庫(kù)模式
--source arg# 從庫(kù) 端口號(hào)
--only arg# 指定單一的數(shù)據(jù)庫(kù)復(fù)制
--slavedelay arg# 設(shè)置從庫(kù)同步主庫(kù)的延遲時(shí)間

 * Replica set(副本集)選項(xiàng):

--replSet arg# 設(shè)置副本集名稱

 * Sharding(分片)選項(xiàng)

--configsvr# 聲明這是一個(gè)集群的config服務(wù),默認(rèn)端口27019,默認(rèn)目錄/data/configdb
--shardsvr# 聲明這是一個(gè)集群的分片,默認(rèn)端口27018
--noMoveParanoia# 關(guān)閉偏執(zhí)為moveChunk數(shù)據(jù)保存

三、基礎(chǔ)操作

3.1 數(shù)據(jù)庫(kù)操作

a.創(chuàng)建數(shù)據(jù)庫(kù)

MongoDB 創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)法格式如下:

use DATABASE_NAME            #如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建數(shù)據(jù)庫(kù),否則切換到指定數(shù)據(jù)庫(kù)。
use dbtest;
> db
dbtest

> show dbs;        #查看數(shù)據(jù)庫(kù)
admin   0.000GB
dbtest  0.000GB
local   0.000GB

b.刪除數(shù)據(jù)庫(kù)

MongoDB 刪除數(shù)據(jù)庫(kù)的語(yǔ)法格式如下:

db.dropDatabase()
> use dbtest;
switched to db dbtest
> db.dropDatabase()
{ "dropped" : "dbtest", "ok" : 1 }
> show dbs;
admin  0.000GB
local  0.000GB

3.2 集合操作

a.創(chuàng)建集合

db.createCollection(name,options)
db.createCollection("user",autoindexID=true)
  • capped:類型為 Boolean,如果為 true 則創(chuàng)建一個(gè)固定大小的集合,當(dāng)其條目達(dá)到最大時(shí)可以自動(dòng)覆蓋以前的條目。在設(shè)置其為 true 時(shí)也要指定參數(shù)大??;

  • autoIndexID:類型為 Boolean,默認(rèn)為 false,如果設(shè)置為 true,則會(huì)在 _id field.s 上自動(dòng)創(chuàng)建索引;

  • size:如果 capped 為 true 需要指定,指定參數(shù)的最大值,單位為 byte;

  • max:指定最大的文檔數(shù)。 在 Mongodb 中也可以不用創(chuàng)建集合,因?yàn)樵趧?chuàng)建文檔的時(shí)候也會(huì)自動(dòng)的創(chuàng)建集合。

> db.createCollection("user",autoindexID=true)        #創(chuàng)建集合user
{ "ok" : 1 }
> show collections;                                    #查看集合
user

b.刪除集合

db.collection.drop()
> show collections;
user
> db.user.drop()
true
> show collections

3.3 文檔操作

a.插入文檔

MongoDB 使用 insert() 或 save() 方法向集合中插入文檔

db.COLLECTION_NAME.insert(document)
> db.user.insert({name:"kaliarch",age:30})            #insert 插入文檔
WriteResult({ "nInserted" : 1 })
> db.user.insert({name:"xuel",age:31})        
WriteResult({ "nInserted" : 1 })        
> db.user.save({name:"anchnet",age:34})                #save插入文檔
WriteResult({ "nInserted" : 1 })        
> db.user.find()                                        #查看文檔
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
  • db.collection.insertOne():向指定集合中插入一條文檔數(shù)據(jù)

  • db.collection.insertMany():向指定集合中插入多條文檔數(shù)據(jù)

b.更新文檔

MongoDB 使用 update() 和 save() 方法來(lái)更新集合中的文檔

--------------------------------------update方式-----------------------------------------

update()方式
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   })

參數(shù)說(shuō)明:

  • query : update的查詢條件,類似sql update查詢內(nèi)where后面的。

  • update : update的對(duì)象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內(nèi)set后面的

  • upsert  : 可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。

  • multi  : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來(lái)多條記錄全部更新。

  • writeConcern  :可選,拋出異常的級(jí)別。

> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
> db.user.update({"name":"xuel"},{$set:{"name":"udxuel"}})                                    #更新name
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "udxuel", "age" : 31 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }

-----------------------------------------save方式--------------------------------------

save()方式
db.collection.save(
   <document>,
   {
     writeConcern: <document>
   })

參數(shù)說(shuō)明:

  • document : 文檔數(shù)據(jù)。

  • writeConcern  :可選,拋出異常的級(jí)別。

> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "udxuel", "age" : 31 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
> db.user.save({ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 })            #更新name
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }

c.刪除文檔

remove() 方法的基本語(yǔ)法格式如下

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   })

參數(shù)說(shuō)明:

  • query :(可選)刪除的文檔的條件。

  • justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔。

  • writeConcern  :(可選)拋出異常的級(jí)別。


> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
> db.user.remove({"name":"xuel","age":31})                            #刪除文檔
WriteResult({ "nRemoved" : 1 })
> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }

d.查看文檔

db.collection.find(query, projection)
  • query :可選,使用查詢操作符指定查詢條件

  • projection :可選,使用投影操作符指定返回的鍵。查詢時(shí)返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。

可以使用 pretty() 方法,語(yǔ)法格式如下:

> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
> db.user.find().pretty()
{
    "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"),
    "name" : "kaliarch",
    "age" : 30
}
{
    "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"),
    "name" : "anchnet",
    "age" : 34
}

3.4 條件操作符

條件操作符用于比較兩個(gè)表達(dá)式并從mongoDB集合中獲取數(shù)據(jù)

  • (>) 大于 - $gt

  • (<) 小于 - $lt

  • (>=) 大于等于 - $gte

  • (<= ) 小于等于 - $lte

  • (=)等于- $eq

  • (!=)不等于-$ne

> db.user.find()
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
{ "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50 }
> db.user.find({"age":{$gt:33}})                             #查詢age大于33的文檔
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
{ "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50 }
> db.user.find({"age":{$lt:33}})                             #查詢age小于33的文檔
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
> db.user.find({"age":{$eq:34}})                              #查詢age等于33的文檔
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
> db.user.find({"age":{$ne:10}})                              、#查詢age不等于10的文檔
{ "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 }
{ "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
{ "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50

3.5 創(chuàng)建索引

索引通常能夠極大的提高查詢的效率,如果沒(méi)有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。

索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)

MongoDB使用 ensureIndex() 方法來(lái)創(chuàng)建索引。

>db.COLLECTION_NAME.ensureIndex({KEY:1})

語(yǔ)法中 Key 值為你要?jiǎng)?chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來(lái)創(chuàng)建索引指定為-1即可。

ensureIndex() 方法中你也可以設(shè)置使用多個(gè)字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫(kù)中稱作復(fù)合索引)。

db.mycol.ensureIndex({"title":1,"description":-1})

3.6 備份恢復(fù)

a.mongodb數(shù)據(jù)備份

mongodump命令腳本語(yǔ)法如下:

mongodump -h dbhost -d dbname -o dbdirectory
  • -h:

    MongDB所在服務(wù)器地址,例如:127.0.0.1,當(dāng)然也可以指定端口號(hào):127.0.0.1:27017

  • -d:

    需要備份的數(shù)據(jù)庫(kù)實(shí)例,例如:test

  • -o:

    備份的數(shù)據(jù)存放位置,例如:c:\data\dump,當(dāng)然該目錄需要提前建立,在備份完成后,系統(tǒng)自動(dòng)在dump目錄下建立一個(gè)test目錄,這個(gè)目錄里面存放該數(shù)據(jù)庫(kù)實(shí)例的備份數(shù)據(jù)。

MongoDB基礎(chǔ)

語(yǔ)法描述實(shí)例
mongodump --host HOST_NAME --port PORT_NUMBER該命令將備份所有MongoDB數(shù)據(jù)mongodump --host localhost --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY
mongodump --dbpath /data/db/ --out /data/backup/
mongodump --collection COLLECTION --db DB_NAME該命令將備份指定數(shù)據(jù)庫(kù)的集合。mongodump --collection mycol --db test

b.mongodb數(shù)據(jù)恢復(fù)

mongorestore命令腳本語(yǔ)法如下:

>mongorestore -h <hostname><:port> -d dbname <path>
  • --host <:port>, -h <:port>:

    MongoDB所在服務(wù)器地址,默認(rèn)為: localhost:27017

  • --db , -d :

    需要恢復(fù)的數(shù)據(jù)庫(kù)實(shí)例,例如:test,當(dāng)然這個(gè)名稱也可以和備份時(shí)候的不一樣,比如test2

  • --drop:

    恢復(fù)的時(shí)候,先刪除當(dāng)前數(shù)據(jù),然后恢復(fù)備份的數(shù)據(jù)。就是說(shuō),恢復(fù)后,備份后添加修改的數(shù)據(jù)都會(huì)被刪除,慎用哦!

  • <path>:

    mongorestore 最后的一個(gè)參數(shù),設(shè)置備份數(shù)據(jù)所在位置,例如:/tmp/testdb

    你不能同時(shí)指定 <path> 和 --dir 選項(xiàng),--dir也可以設(shè)置備份目錄。

  • --dir:

    指定備份的目錄

    你不能同時(shí)指定 <path> 和 --dir 選項(xiàng)。

MongoDB基礎(chǔ)

MongoDB基礎(chǔ)

此時(shí)查看數(shù)據(jù)已經(jīng)正?;謴?fù)。

3.7 密碼權(quán)限

為mongodb設(shè)置密碼,需要進(jìn)行auth啟動(dòng),在配置文件添加auth=true

a.設(shè)置數(shù)據(jù)庫(kù)管理員

> use admin
switched to db admin
> db.createUser({user:"root",pwd:"mongopwd",roles:["userAdminAnyDatabase"]})                #創(chuàng)建用戶密碼,并設(shè)置權(quán)限
Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] }
> db.auth("root","mongopwd")                            #認(rèn)證,返回1為認(rèn)證成功
1

MongoDB基礎(chǔ)

認(rèn)證通過(guò)進(jìn)入數(shù)據(jù)庫(kù)db.auth 也可以在登錄的時(shí)候直接指定用戶名密碼登錄

mongo -u root -p mongopwd --authenticationDatabase admin

b.創(chuàng)建數(shù)據(jù)庫(kù)用戶

> use test
switched to db test
> db
test
>  db.createUser({user:"testuser",pwd:"testpass",roles:["readWrite"]})
Successfully added user: { "user" : "testuser", "roles" : [ "readWrite" ] }
> db.auth("testuser","testpass")
1

MongoDB基礎(chǔ)

四、自動(dòng)備份腳本

最后寫(xiě)一個(gè)mongodb自動(dòng)備份腳本,配合crond來(lái)定時(shí)備份數(shù)據(jù)

github地址


#!/bin/bash
#auth:xuel@anchnet.com
#backup mongodb

. /etc/profile
CMD=`which mongodump`
DATE=`date +%F`
DB="test"
DB_HOST="localhost"
DB_PORT="27017"
DB_USER="testuser"
DB_PWD="testpass"
BACKUP_DIR="/data/mongodb/"
TAR_DIR="/data/tardir/"
TAR_DIR_DATE="${TAR_DIR}${DATE}"
TAR_BAK="mongodb_bak_$DATE.tar.gz"

check_dir(){
        for DIR in ${BACKUP_DIR} ${TAR_DIR_DATE}
        do
                if [ ! -d $DIR ];then
                        mkdir -p $DIR
                fi
        done
}
backup_mongodb(){
        $CMD -h ${DB_HOST}:${DB_PORT} -u $DB_USER -p $DB_PWD -d ${DB} -o ${BACKUP_DIR}${DATE} >/dev/null
        if [ $? -eq 0 ];then
                tar -zcf ${TAR_DIR_DATE}/${TAR_BAK} ${BACKUP_DIR}${DATE} && return 0
        fi
}
clean_tar() {
        find ${TAR_DIR} -mtime +7 -exec rm -rf {} \; && return 0
}

main() {
        check_dir
        [ $? -eq 0 ] && backup_mongodb
        [ $? -eq 0 ] && clean_tar
}

main


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI