1. 程式人生 > >MongoDB基礎

MongoDB基礎

mongodb nosql 文檔

一、概述

1.1 MongoDB概念

MongoDB 是由C++語言編寫的,是一個基於分布式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保證服務器性能。MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。在nosql數據庫裏,大部分的查詢都是鍵值對(key、value)的方式。MongoDB是一個介於關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中最像關系數據庫的。其特征NoSQL、文檔存儲、Json數據模型、支持事務。

1.2 NoSQL概念

NoSQL,指的是非關系型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關系型數據庫的數據庫管理系統的統稱。

NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。

1.3 NoSQL的特征

高擴展性:Nosql去掉了關系數據庫的關系型特性,易於橫向擴展。

高性能:Nosql通過簡單的key-value方式獲取數據,非常快速。還有NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要性能高很多。

靈活的數據模型

:相對於關系數據庫裏,增刪字段的繁瑣,NoSQL無需事先為要存儲的數據建立字段,隨時可以存儲自定義的數據格式。

高可用:NoSQL在不太影響性能的情況,就可以方便的實現高可用的架構。比如mongodb通過mongos、config server replica set,shard就可以快速配置出高可用配置。

1.4 NoSQL分類

類型部分代表特點
列存儲

Hbase

Cassandra

Hypertable

顧名思義,是按列存儲數據的。最大的特點是方便存儲結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。

文檔存儲

MongoDB

CouchDB

文檔存儲一般用類似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段建立索引,實現關系數據庫的某些功能。

key-value存儲

Tokyo Cabinet / Tyrant

Berkeley DB

MemcacheDB

Redis

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

圖存儲

Neo4J

FlockDB

圖形關系的最佳存儲。使用傳統關系數據庫來解決的話性能低下,而且設計使用不方便。

對象存儲

db4o

Versant

通過類似面向對象語言的語法操作數據庫,通過對象的方式存取數據。

xml數據庫

Berkeley DB XML

BaseX

高效的存儲XML數據,並支持XML的內部查詢語法,比如XQuery,Xpath。

1.5 MongoDB概念解析

在mongodb中基本的概念是文檔、集合、數據庫,對應與關系型數據庫如下表:

SQL術語/概念MongoDB術語/概念解釋/說明
databasedatabase數據庫
tablecollection數據庫表/集合
rowdocument數據記錄行/文檔
columnfield數據字段/域
indexindex索引
table joins
表連接,MongoDB不支持
primary keyprimary key主鍵,MongoDB自動將_id字段設置為主鍵

數據庫:一個MongoDB 實例可以承載多個數據庫。它們之間可以看作相互獨立,每個數據庫都有獨立的權限控制。在磁盤上,不同的數據庫存放在不同的文件中。MongoDB 中存在以下系統數據庫。

  • Admin 數據庫:一個權限數據庫,如果創建用戶的時候將該用戶添加到admin 數據庫中,那麽該用戶就自動繼承了所有數據庫的權限。

  • Local 數據庫:這個數據庫永遠不會被負責,可以用來存儲本地單臺服務器的任意集合。

  • Config 數據庫:當MongoDB 使用分片模式時,config 數據庫在內部使用,用於保存分片的信息。

集合:集合就是一組文檔,類似於關系數據庫中的表。集合是無模式的,集合中的文檔可以是各式各樣的。在MongoDB中集合用collections表示,每個

collection用一個名字標識,需要註意以下幾點:

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

  • 名字不能包含\0字符,因為它表示名字的結束

  • 不能創建以system.開頭的

文檔:文檔是 MongoDB 中數據的基本單位,類似於關系數據庫中的行(但是比行復雜)。多個鍵及其關聯的值有序地放在一起就構成了文檔。

  • 文檔中的鍵/值對是有序的。

  • 文檔中的值不僅可以是在雙引號裏面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。

  • MongoDB區分類型和大小寫。

  • MongoDB的文檔不能有重復的鍵。

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

二、安裝部署

2.1 配置yum安裝

配置mongodb的yum源進行安裝

cat >/etc/yum.repos.d/mongodb.repo<<EOF
[mongodb]
name=MongoDB Repository
baseurl= 
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}                           #創建數據,日誌,配置文件目錄
touch /usr/local/mongodb/mongoLog/mongodb.log                              #創建日誌文件
echo "PATH=$PAHT:/usr/local/mongodb/bin">/etc/profile.d/mongodb.sh                        
source etc/profile.d/mongodb.sh                                     #配置環境變量

命令行啟動:

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

將啟動的各項參數寫入配置文件啟動

cat>/usr/local/mongodb/conf/mongodb.conf<<EOF
dbpath=/usr/local/mongodb/mongoData                    #數據存儲目錄
logpath=/usr/local/mongodb/mongoLog/mongodb.log                    #日誌文件
logappend=true                                      # 使用追加的方式寫日誌
journal=true                    
quiet=true        
port=27017                                        #端口
maxConns=20000                                      #最大連接數
httpinterface=true                                    #開啟web界面端口為:28017      
fork=true                                        #以守護進程的方式運行MongoDB
EOF

mongod -f /usr/local/mongodb/conf/mongodb.conf                          #指定配置文件啟動

技術分享圖片

c

2.3 mongod配置參數詳解

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

* Replicaton 參數

--fastsync# 從一個dbpath裏啟用從庫復制服務,該dbpath的數據庫是主庫的快照,可用於快速啟用同步
--autoresync# 如果從庫與主庫同步數據差得多,自動重新同步,
--oplogSize arg# 設置oplog的大小(MB)

* 主/從參數

--master# 主庫模式
--slave# 從庫模式
--source arg# 從庫 端口號
--only arg# 指定單一的數據庫復制
--slavedelay arg# 設置從庫同步主庫的延遲時間

* Replica set(副本集)選項:

--replSet arg# 設置副本集名稱

* Sharding(分片)選項

--configsvr# 聲明這是一個集群的config服務,默認端口27019,默認目錄/data/configdb
--shardsvr# 聲明這是一個集群的分片,默認端口27018
--noMoveParanoia# 關閉偏執為moveChunk數據保存

三、基礎操作

3.1 數據庫操作

a.創建數據庫

MongoDB 創建數據庫的語法格式如下:

use DATABASE_NAME            #如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。
use dbtest;
> db
dbtest

> show dbs;        #查看數據庫
admin   0.000GB
dbtest  0.000GB
local   0.000GB

b.刪除數據庫

MongoDB 刪除數據庫的語法格式如下:

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.創建集合

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

  • autoIndexID:類型為 Boolean,默認為 false,如果設置為 true,則會在 _id field.s 上自動創建索引;

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

  • max:指定最大的文檔數。 在 Mongodb 中也可以不用創建集合,因為在創建文檔的時候也會自動的創建集合。

> db.createCollection("user",autoindexID=true)        #創建集合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():向指定集合中插入一條文檔數據

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

b.更新文檔

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

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

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

參數說明:

  • query : update的查詢條件,類似sql update查詢內where後面的。

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

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

  • multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。

  • writeConcern :可選,拋出異常的級別。

> 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>
   })

參數說明:

  • document : 文檔數據。

  • writeConcern :可選,拋出異常的級別。

> 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() 方法的基本語法格式如下

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

參數說明:

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

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

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


> 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 :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。

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

> 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.3 條件操作符

條件操作符用於比較兩個表達式並從mongoDB集合中獲取數據

  • (>) 大於 - $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


MongoDB基礎