MongoDB資料庫詳解

来源:https://www.cnblogs.com/bananaaa/archive/2018/01/05/8204362.html
-Advertisement-
Play Games

第1章 資料庫管理系統 1.1 前言 01.數據的定義:文字、圖像、地理位置信息(坐標、經緯度)等 02.資料庫管理系統的定義:建立、存取和管理數據,保證數據安全和完整性的軟體 03.常見的資料庫管理系統: 關係型:MySQL、Oracle、SQL Server、Db2等 非關係型:MongoDB、 ...


第1章 資料庫管理系統

1.1 前言

01.數據的定義:文字、圖像、地理位置信息(坐標、經緯度)等

02.資料庫管理系統的定義:建立、存取和管理數據,保證數據安全和完整性的軟體

03.常見的資料庫管理系統:

關係型:MySQL、Oracle、SQL Server、Db2等
非關係型:MongoDB、Redis、HBase等

資料庫管理系統使用情況排名https://db-engines.com/en/ranking

1.2 NoSQL簡介

NoSQL=Not Only SQL,支持類似SQL的功能, 與Relational Database相輔相成

其適用於性能較高,不使用SQL意味著沒有結構化的存儲要求(SQL為結構化的查詢語句),沒有約束之後架構更加靈活

1.2.1 NoSQL資料庫四大家族

列存儲:Hbase

鍵值(Key-Value)存儲:Redis

圖像存儲:Neo4J

文檔存儲:MongoDB

1.2.2 NoSQL的優勢

高可擴展性、分散式計算、沒有複雜的關係、低成本、架構靈活、半結構化數據

 

第2章 MongoDB

2.1 MongoDB特性

即最像關係型資料庫的NoSQL

 

MongoDB與RDBMS的最大區別:

沒有固定的行列組織數據結構,即無需將不同類的數據放入多張表中建立對應關係並分別存儲其數據,而是直接放入一份文檔進行存儲

2.1.1 數據存儲格式

01. JSON

MongoDB使用JSON(JavaScript ObjectNotation)文檔存儲記錄

JSON資料庫語句可以容易被解析

Web應用大量使用

NAME-VALUE配對

02. BSON

二進位的JSON,JSON文檔的二進位編碼存儲格式

BSON有JSON沒有的Date和BinData

MongoDB中document以BSON形式存放

數據格式靈活-文檔里嵌入文檔

1 {
2 _id: ObjectID("1"),
3 username: “Silence”,
4 regDate: “10-10-2015”,
5 scores: {
6 math: "80",
7 english: "200"
8   }
9 }

2.2 MongoDB優勢

MongoDB是開源產品,On GitHub,Licensed under the AGPL,起源&贊助by MongoDB公司,提供商業版licenses許可

01.功能

JSON文檔模型、動態的數據模式、二級索引強大(特有)、查詢功能、自動分片、水平擴展、自動複製、高可用、文本搜索、企業級安全、聚合框架MapReduce、大文件存儲GridFS、地理位置索引

支持多種存儲引擎:

 

02.存儲引擎比較

 

MySQL

InnoDB

MongoDB

MAPI

MongoDB

WiredTiger

事務

YES

NO

NO

鎖粒度

ROW-level行級鎖

Collection-level

Document-level

Geospatial

YES

YES

YES

MVCC

YES

NO

NO

Replication

YES

YES

YES

外鍵

YES

NO

NO

資料庫集群

NO

YES

YES

B-TREE索引

YES

YES

YES

全文檢索

YES

YES

YES

數據壓縮

YES

NO

YES

存儲限制

64TB

NO

NO

表分區

YES

YES(分片)

YES(分片)

03.資料庫功能和性能分佈圖

 

2.3 數據邏輯結構

2.3.1 層次關係

文檔(document)、集合(collection)、資料庫(database)

2.3.2 層次關係圖

 

2.3.3 MongoDB與RDBMS數據結構邏輯對比

MongoDB

VS

RDBMS

集合Collection

->

表Table

文檔Document

->

行Row

資料庫Database

 

資料庫Database

索引值Index

->

索引值Index

嵌入式文件Embedded Document

->

合併Join

引用Reference

->

外鍵Foreign Key

分片Shard

->

分區Partition

2.4 MongoDB適用場景

1)網站數據:MongoDB 非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性
2)緩存:由於性能很高,MongoDB 也適合作為信息基礎設施的緩存層。在系統重啟之後,由 MongoDB 搭建的持久化緩存層可以避免下層的數據源過載
3)大尺寸,低價值的數據:使用傳統的關係型資料庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的文件進行存儲
4)高伸縮性的場景:MongoDB 非常適合由數十或數百台伺服器組成的資料庫。MongoDB的路線圖中已經包含對 MapReduce 引擎的內置支持
5)用於對象及 JSON 數據的存儲:MongoDB 的 BSON 數據格式非常適合文檔化格式的存儲及查詢

2.4.1 MongoDB使用場景

1 我的數據量是有億萬級或者需要不斷擴容 
2 需要2000-3000以上的讀寫每秒
3 新應用,需求會變,數據模型無法確定
4 我需要整合多個外部數據源
5 我的系統需要99.999%高可用
6 我的系統需要大量的地理位置查詢
7 我的系統需要提供最小的latency
8 我要管理的主要數據對象 <10

說明:以上條件滿足一個可以考慮MongoDB,滿足兩個選擇MongoDB不會後悔

 

第3章 MongoDB軟體安裝

3.1 前提條件

官方下載地址www.mongodb.com

安裝文檔地址
docs.mongodb.com
mongoing.com

軟體所支持的平臺(X86_64)

  在3.4版更改:MongoDB不再支持32位的x86平臺

 

註意:切記在選擇mongodb版本時要確認支持/相容哪些操作系統及版本信息,如使用3.2版本需安裝在CentOS6.2級以上操作系統

3.1.1 安裝前準備

01.準備Redhat或Centos6.2以上系統

02.系統開發包完整

03.關閉iptables及Selinux

04.配置IP地址和hosts解析

05.關閉hugepage大頁記憶體

06.創建所需用戶mongod(非root用戶)

07.創建所需目錄,並授權

3.1.1.1  具體步驟

1 [root@mongodb ~]# cat /etc/redhat-release
2 CentOS release 6.9 (Final)
3 
4 [root@mongodb ~]# uname -r
5 2.6.32-696.el6.x86_64
6 
7 [root@mongodb ~]# uname -m
8 x86_64

 

1 /etc/init.d/iptables status
2 getenforce
3 ip a
4 echo "10.0.0.51 mongodb" >>/etc/hosts
5 
6 /etc/init.d/mysqld stop   #若存在mysql程式需提前關閉以防止程式衝突

關閉大頁記憶體機制以提高性能

1 vim /etc/rc.local
2 
3 #以root用戶身份在最後一行添加如下代碼,重啟生效
4 if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
5   echo never > /sys/kernel/mm/transparent_hugepage/enabled
6 fi
7 if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
8    echo never > /sys/kernel/mm/transparent_hugepage/defrag
9 fi

系統關閉參照官方文檔https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

3.2 安裝及啟動

01.創建所需用戶和組

 1 groupadd -g 800 mongod 2 useradd -u 801 -g mongod mongod 3 passwd mongod 

02.創建mongodb所需目錄結構

 1 mkdir -p /application/mongodb/{bin,conf,log,data} 

03.上傳並解壓軟體到指定位置

1 cd /application/
2 
3 rz#上傳mongodb-linux-x86_64-3.2.8.tgz包
4 
5 tar -zxvf mongodb-linux-x86_64-3.2.8.tgz
6 cd mongodb-linux-x86_64-3.2.8/bin/
7 cp -a * /application/mongodb/bin

04.設置目錄結構許可權

 1 chown -R mongod:mongod /application/mongodb 

05.設置用戶環境變數

1 su - mongod

2

3 vim .bash_profile

4 export PATH=/application/mongodb/bin:$PATH

5

6 source .bash_profile 

06.啟動mongodb(無需初始化)

 1 mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork 

說明:在啟動mongodb要指定數據、日誌路徑及埠號(預設也可以)

06.1成功標識

about to fork child process, waiting until server is ready for connections.
forked process: 1294
child process started successfully, parent exiting

3.2.1 mongodb啟動參數詳解

mongod參數

參數說明

--dbpath

數據存放路徑

--logpath

日誌文件路徑

--logappend

日誌輸出方式->以追加模式進行記錄,預設覆蓋記錄

--port

啟用埠號

--fork

以後臺守護進程的方式啟動

--auth

是否需要驗證許可權登錄(用戶名和密碼)

--bind_ip

限制訪問的ip

 

07.編輯配置文件->以讀取配置文件的方式來啟動資料庫

1 vim /application/mongodb/conf/mongod.conf
2 
3 dbpath=/application/mongodb/data
4 logptah=/application/mongodb/log/mongodb.log
5 port=27017
6 logappend=1
7 fork=1

08.指定配置文件啟動/關閉mongod

1 mongod -f /application/mongodb/conf/mongod.conf #啟動資料庫

2 mongod -f /application/mongodb/conf/mongod.conf shutdown #關閉 

09.登錄mongodb

1 mongo
2 
3 ###此時已登陸mongodb系統,以下為提示信息###
4 MongoDB shell version: 3.2.8
5 connecting to: test
6 > 

說明:

01.初次登錄時預設提示版本號信息及連接資料庫test,但是在MongoDB中test資料庫預設並不存在

02.對於3.2以上版本預設只有一個admin資料庫,且無需提前創建,不存在的庫也能夠正常use

3.2.2 啟動時報錯:"WARNING: soft rlimits too low. rlimits set to 1024 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files"的類似錯誤

報錯原因:rlimits設置過小,其設置幾乎不能滿足MongoDB運行所需的最小條件,會導致它運行緩慢甚至出現不可知的錯誤

解決思路:

01.查看當前的MongoDB進程信息

1 ps -ef | grep mongod
2 
3 #結果如下
4 mongod     1982      1  0 11:47 ?        00:00:16 mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
5 root       2056   1566  0 12:21 pts/1    00:00:00 grep --color=auto mongod

02.查看mongod進程的系統限制

1 cat /proc/1982/limits
2 
3 #結果如下
4 Limit             Soft Limit(軟限制->最小值) Hard Limit(硬限制->最大值) Units
5 Max processes      1024                     64000                   processes
6 Max open files      65535                    65535                   files

解決方法:

①方法一

1 vim /etc/security/limits.d/90-nproc.conf

2 * soft nproc 32000 #此為修改後結果,reboot重啟生效 

②方法二

1 vim /etc/security/limits.conf
2 
3 # End of file
4 mongod soft nofile 64000
5 mongod hard nofile 64000
6 mongod soft nproc 32000 
7 mongod hard nproc 32000

查看系統限制

 1 ulimit -a 

#也可利用ulimit [-ftvnmu]命令在shell命令行中直接進行設置

#但若要系統啟動時在所有視窗生效,需將上面的ulimit添加到/etc/profile

3.2.3 YAML模式編寫配置文件

 1 systemLog:
 2    destination: file
 3    path: "/application/mongodb/log/mongod.log"
 4    logAppend: true
 5 storage:
 6    journal:
 7       enabled: true
 8    dbPath: "/application/mongodb/data"
 9 processManagement:
10    fork: true
11 net:
12    port: 27017

此時關閉mongodb重新啟動即可

3.2.4 MongoDB的關閉方式

3.2.4.1  kill進程模式(不建議使用)

1 $ kill -2 PID #原理:-2表示向mongod進程發送SIGINT信號

2

3 $ kill -4 PID #原理:-4表示向mognod進程發送SIGTERM信號 

3.2.4.2  自帶模式

1 use admin
2 
3 admin> db.adminCommand({shutdown:1})
4 5 $ mongod -f mongodb.conf --shutdown
6 killing process with pid: 1621

註意:

01.mongod進程收到SIGINTSIGTERM信號,會做一些處理

02.切忌使用kill -9

3.2.5 編輯腳本實現SYS-V形式啟動mongod

 1 vim /etc/rc.d/init.d/mongod
 2 #!/bin/bash
 3 #
 4 #chkconfig: 2345 80 90
 5 #description:mongodb
 6 MONGODIR=/application/mongodb
 7 MONGOD=$MONGODIR/bin/mongod
 8 MONGOCONF=$MONGODIR/conf/mongod1.conf
 9 start() {
10  su - mongod -c "$MONGOD -f $MONGOCONF"
11 }
12 
13 stop() {
14 su - mongod -c "$MONGOD -f $MONGOCONF --shutdown"
15 }
16 
17 case "$1" in
18   start)
19  start
20  ;;
21   stop)
22  stop
23  ;;
24   restart)
25  stop
26 sleep 2
27  start
28  ;;
29   *)
30  echo $"Usage: $0 {start|stop|restart}"
31  exit 1
32 esac
33 
34 
35 chmod +x /etc/init.d/mongod
mongod.conf

3.3 基本操作及使用

獲取幫助

 1 > help 

    db.help()                    help on db methods
    db.mycoll.help()             help on collection methods
    sh.help()                    sharding helpers
    rs.help()                    replica set helpers
    help admin                   administrative help
    help connect                 connecting to a db help
    help keys                    key shortcuts
    help misc                    misc things to know
    help mr                      mapreduce

    show dbs                     show database names
    show collections             show collections in current database
    show users                   show users in current database
    show profile                 show most recent system.profile entries with time >= 1ms
    show logs                    show the accessible logger names
    show log [name]              prints out the last segment of log in memory, 'global' is default
    use <db_name>                set current database
    db.foo.find()                list objects in collection foo
    db.foo.find( { a : 1 } )     list objects in foo where a == 1
    it                           result of the last line evaluated; use to further iterate
    DBQuery.shellBatchSize = x   set default number of items to display on shell
    exit                         quit the mongo shell
help幫助信息

查看當前db版本

1 > db.version()

2 3.2.8 

查看當前使用db

1 > db

2 test

3

4 > db.getName()

5 test 

查詢所有資料庫

1 > show dbs

2 local 0.000GB 

切庫

1 > use test

2 switched to db test 

顯示當前資料庫狀態

 1 > db.stats()
 2 {
 3     "db" : "local",
 4     "collections" : 1,
 5     "objects" : 7,
 6     "avgObjSize" : 1466,
 7     "dataSize" : 10262,
 8     "storageSize" : 36864,
 9     "numExtents" : 0,
10     "indexes" : 1,
11     "indexSize" : 36864,
12     "ok" : 1
13 }

查看當前資料庫的連接機器地址

1 > db.getMongo()

2 connection to 127.0.0.1 

創建資料庫

當使用use命令時系統會自動創建一個資料庫,如果use之後沒有創建任何集合,系統就會刪除這個資料庫

 1 > use banana

2 switched to db banana 

 刪除資料庫

如果沒有選擇任何資料庫,會刪除預設的test資料庫

1 > db.dropDatabase()
2 { "ok" : 1 }
3 > show dbs;
4 local  0.000GB

 

創建集合

方法1:

1 > use banana;
2 switched to db banana        #相當於use banana ,不同的是(從mysql關係型資料庫角度解釋),在mongodb中banana允許未創建情況下use banana,在創建數據表後,即創建了banana,否則banana不會創建
3 > db.createCollection('a'); #創建集合a,a相當於mysql中的數據表
4 { "ok" : 1 }                # 提示創建成功
5 > db.createCollection('b');
6 { "ok" : 1 }
7 > show collections;
8 a
9 b

 方法2:

 1 > db.c.insert({username:"mongodb"})   #向c集合插入數據
 2 WriteResult({ "nInserted" : 1 })   ->成功寫入文檔
 3 
 4 > show collections
 5 a
 6 b
 7 c
 8 > db.c.find()   #顯示數據集合中所有數據,當前僅一條
 9 { "_id" : ObjectId("5743c9a9bf72d9f7b524713d"), "username" : "mongodb" }
10 > db.log.find().pretty();   # 格式化列印結果
11 {
12     "_id" : ObjectId("5743c9a9bf72d9f7b524713d"),
13     "uid" : 0,
14     "name" : "mongodb",
15     "age" : 6,
16     "date" : ISODate("2018-01-03T08:37:00.214Z")
17 }
18 
19 > db.c.drop()   #刪除c集合
20 true
21 > db.c.find()   #c集合置空

批量插入數據

1 > for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }   #批量插入10000個數據
2 
3 #查詢集合中的記錄數
4 > db.log.find()
說明:預設每頁顯示20條記錄,當顯示不下的的情況下,可以用it迭代命令查詢下一頁數據
 1 #設置每頁顯示數據的大小:每頁顯示50條記錄
 2 > DBQuery.shellBatchSize=50; 
 3 #查看第1條記錄
 4 > db.log.findOne() 
 5 #查詢總的記錄數
 6 > db.log.count()
 7 #刪除集合中所有記錄
 8 > db.log.remove({})
 9 #集合中數據的原始大小
10 > db.log.dataSize()
11 #集合中索引數據的原始大小
12 > db.log.totalIndexSize()
13 #集合中索引+數據壓縮存儲之後的大小
14 > db.log.totalSize()
15 #集合中數據壓縮存儲的大小
16 > db.log.storageSize()

 

此筆記是本人學習摘記整理而成,此為初稿(尚有諸多不完善之處),原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處,作者信息和本聲明,否則將追究法律責任。

作者:banana童

出處:http://www.cnblogs.com/bananaaa/

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於Word中的郵件合併功能,用戶可以將郵件合併後的結果文檔保存並列印,也可以通過郵件的形式發送,在很多場合需要使用到此功能。那對於編程人員,我們也可以在C#語言環境中通過代碼的形式來實現。根據需要先創建郵件合併模板後,可合併文本和圖片,在下麵的方法中,需要使用到組件Free Spire.Doc f ...
  • 常見的AOP設計都基於Remoting的RealProxy,或者基於Emit實現的動態代理,或者基於反射的Attribute掃描攔截。但是我們還有另類的攔截方案DynamicObject,只要我們繼承DynamicObject,重載幾個方法即可,話不多說,上代碼。 Demo: ...
  • 最近有項目需求,要實現在網頁上獲取伺服器信息。大家都知道,網頁程式很難獲取客戶端信息比如MAC、CPU、硬碟信息等等。當時想過一些種方案,比如:通過IE插件,但只能用IE瀏覽器。正為這事焦頭爛額時,一天回家的路上,突發靈感,能不能在客戶端放一個服務,通過JavaScript 訪問這個服務,這樣就可以 ...
  • 調用介面時報錯:WebApi 找到了與該請求匹配的多個操作,就算你的路由是唯一的,也報錯。 我已經配置了路由,如下 這時候就看看你的命名空間using裡面有沒有包含:using System.Web.Mvc; 如果有的話,就把它刪除掉,然後引用:using System.Web.Http; 出現上述 ...
  • 起因 最近碰到一件事:B同學在他電腦的 虛擬機中學習搭建伺服器碰到了問題,要我幫他看下。我總不能一個QQ遠程桌面連過去,那樣操作會卡到崩潰。 過去是最好的方法,不過他的電腦跟我不在一個區域網,又是虛擬機,要怎麼連過去呢? 怎麼解決? 有兩種方法: 1. 通過一臺公網伺服器,通過 命令建立反向隧道 2 ...
  • 2017年12月31日,我終於決定把自己的筆記本裝上 Ubuntu17.10系統,徹底把 Windows 給抹了。以前都還只是裝在虛擬機上,但最終還是下定了決心。用的這幾天與遇到過些許問題,特別是今天,發現系統預裝的中文輸入法在 vscode 上工作不了,最終才明白了是怎麼回事。趁著剛申請的博客,剛 ...
  • 首先,不要誤解,我這裡的計算器是指硬體的計算器,至於純軟體的計算程式,乃至有高級功能的,比如可以求解方程甚至可編程之類,我以後找個時間來說說。這兩天看到有人在博問里問類似的問題,原問是想設計一個有著數位管、有著4x4鍵盤的硬體里的程式,不知道他具體想做什麼,只是給了一些建議。聯想到還有計算器這個東西 ...
  • 前言 上次安裝了Sonarqube英文版使用起來不方便,這次為Sonarqube安裝中文插件。 前期準備: 軟體下載: https://github.com/SonarQubeCommunity/sonar-l10n-zh 安裝插件: 1.下載插件jar文件 2.將jar文件複製到Sonarqube ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...