MongoDb 入門教程

MongoDb 入門教程

 

MongoDb 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。css

它是可擴展的高性能數據存儲解決方案,常常被用於非關係型數據的存儲,能存儲海量的數據。html

常見的非關係型數據庫還有:Redis,但 MongoDb 比 redis 更具備數據庫的特性。python

MongoDb的基本數據結構

與 MySQL 等關係型數據庫同樣,MongoDb 也有相似的概念,可是其稱呼不一樣。下表列出了 MongoDb 的基本數據結構以及與 MySQL 的對比。git

SQL術語/概念 MongoDB術語/概念 解釋/說明
database database 數據庫
table collection 數據庫表/集合
row document 數據記錄行/文檔
column field 數據字段/域
index index 索引
table joins   錶鏈接,MongoDb不支持
primary key primary key 主鍵,MongoDb自動將_id字段設置爲主鍵

能夠看到 MongoDb 與 SQL 的數據庫概念都是一致的,而 MongoDb 中數據庫表(Table)則稱之爲集合(Collection),行(Row)則稱爲文檔(Document),列(Column)則稱爲字段(Field)。github

安裝MongoDb服務器

MongoDB 提供了 OSX 平臺上 64 位的安裝包,你能夠在官網下載安裝包。redis

下載地址:MongoDb Download Center | MongoDBsql

下載後解壓文件並作好PATH路徑配置:mongodb

# 解壓文件 tar -zxvf mongodb-osx-x86_64-3.4.7.tgz # 配置${mongodb_home}/bin到PATH路徑 export PATH=<mongodb-install-directory>/bin:$PATH

建立數據庫存儲目錄:shell

mkdir -p /data/db

建立完目錄以後,直接運行mongod命令便可啓動MongoDb服務器。mongod命令默認使用/data/db爲 MongoDb 數據庫的數據文件目錄。若是須要改變數據文件存儲目錄,須要指定--dbpath參數,例如:數據庫

mongod --dbpath /Users/yurongchan/mongodb_data_file

相似的啓動配置參數還有:

參數 描述
--bind_ip 綁定服務IP,若綁定127.0.0.1,則只能本機訪問,不指定默認本地全部IP
--logpath 定MongoDB日誌文件,注意是指定文件不是目錄
--logappend 使用追加的方式寫日誌
--dbpath 指定數據庫路徑
--port 指定服務端口號,默認端口27017
--serviceName 指定服務名稱
--serviceDisplayName 指定服務名稱,有多個mongodb服務時執行。
--install 指定做爲一個Windows服務安裝。

運行mongod命令後控制檯輸出一系列初始化信息,包括使用的數據庫文件存儲目錄等。若是沒有什麼異常信息,那就說明 MongoDb 服務器啓動成功。

2017-08-27T15:23:39.680+0800 I CONTROL [initandlisten] MongoDB starting : pid=27207 port=27017 dbpath=/data/db 64-bit host=YuRongChandeMacBook-Pro.local 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] db version v3.4.7 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] git version: cf38c1b8a0a8dca4a11737581beafef4fe120bcd 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] allocator: system 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] modules: none 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] build environment: 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] distarch: x86_64 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] target_arch: x86_64 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] options: {} 2017-08-27T15:23:39.682+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=3584M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),

若是你的操做系統是Windows系統,你能夠經過查閱這裏獲取安裝的詳細方法。

鏈接MongoDb服務器

服務器啓動以後,咱們啓動一個終端鏈接到 MongoDb 服務器,這樣咱們就能夠運行進行數據庫CURD操做。鏈接MongoDb服務器命令的語法以下:

mongo server_ip:port/dbname -u user -p password

咱們這裏直接鏈接本地服務器,所以直接運行mongo命令便可。此時控制檯會打印出鏈接的 MongoDb 服務器地址以及端口等信息。

YuRongChandeMacBook-Pro:~ yurongchan$ mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.
For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000

而 MongoDb 服務器控制檯也會輸出相關信息,提示有客戶端鏈接到本服務器上。

2017-09-03T15:05:52.799+0800 I NETWORK [thread1] connection accepted from 127.0.0.1:55283 #1 (1 connection now open) 2017-09-03T15:05:52.804+0800 I NETWORK [conn1] received client metadata from 127.0.0.1:55283 conn1: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "3.4.7" }, os: { type: "Darwin", name: "Mac OS X", architecture: "x86_64", version: "14.1.0" } }

MongoDb建立數據庫

MongoDb 建立和切換數據庫的語法格式爲:

use database_name

若是數據庫不存在,則建立數據庫,不然切換到指定數據庫。

> use chenyurong switched to db chenyurong > db chenyurong > show dbs admin 0.000GB local 0.000GB

上面建立了名爲chenyurong的數據庫,可是咱們使用show dbs命令時並無看到該數據庫存在,這是由於該數據庫中尚未數據。要顯示它,咱們須要向 chenyurong 數據庫插入一些數據。關於插入數據操做,將在下面說起。

MongoDb建立表

MongoDb 中並無直接建立表的命令,表的數據結構在你往表插入數據時肯定。所以在 MongoDb 中,你建立完數據庫以後就能夠直接往表中插入數據,表名在插入數據時指定。

MongoDb插入數據

MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法以下:

db.collection.insert(document)

下面咱們向user表插入一條數據:

> db.user.insert({
... "name": "chenyurong", ... "age": 25, ... "addr": "ShenZhen" ... }) WriteResult({ "nInserted" : 1 }) > db.user.find() { "_id" : ObjectId("59a2782f6eb4c099dbb718a1"), "name" : "chenyurong", "age" : 25, "addr" : "ShenZhen" } > show dbs admin 0.000GB chenyurong 0.000GB local 0.000GB

能夠看到咱們成功向user表插入了一條數據,此時咱們使用show dbs也能看到對應chenyurong數據庫。

上面使用db.user.find()查詢的結果沒有格式化,不便於閱讀。咱們可使用pretty()函數使其輸出格式化。

> db.user.find().pretty() { "_id" : ObjectId("59abb034dca9453471d67f13"), "name" : "chenyurong", "age" : 25, "addr" : "ShenZhen" }

文章首發於【博客園-陳樹義】,點擊跳轉到原文MongoDb入門教程

MongoDb查詢數據

爲了方便演示接下來的查詢功能,咱們這裏運行如下命令清空數據庫表user,並向其中插入一些測試數據。

//清空當前數據庫下user表的全部數據
> db.user.remove({})
WriteResult({ "nRemoved" : 2 }) //查看user表的全部數據 > db.user.find() //批量插入數據 > db.user.insert([ ... { ... "name": "ChenYuRong", ... "age": 25, ... "addr": "ShenZhen" ... }, ... { ... "name": "LiQiLiang", ... "age": 27, ... "addr": "GuangZhou" ... }, ... { ... "name": "XiaoPai", ... "age": 30, ... "addr": "BeiJing" ... }, ... { ... "name": "YuChangHui", ... "age": 32, ... "addr": "FuJian" ... }, ... { ... "name": "XiaoHei", ... "age": 28, ... "addr": "ShenZhen" ... }, ... { ... "name": "AnQi", ... "age": 20, ... "addr": "JieYang" ... }] ... ) BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 6, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })

此時 user 表中的數據列表以下:

name age addr
ChenYuRong 25 ShenZhen
LiQiLiang 27 GuangZhou
XiaoPai 30 BeiJing
YuChangHui 32 FuJian
XiaoHei 28 ShenZhen
AnQi 20 JieYang

MongoDB 查詢數據的語法格式以下:

db.collection.find(query, projection)
  • query(可選):使用查詢操做符指定查詢條件。該參數是一個JSON對象,key 通常爲查詢的列名,value 爲查詢匹配的值。
  • projection(可選):使用投影操做符指定返回的鍵。若是省略該參數,那麼查詢時返回文檔中全部鍵值。該參數是一個JSON對象,key 爲須要顯示的列名,value 爲 1(顯示) 或 0(不顯示)。

下面的查詢語句將user表中地址(addr)爲ShenZhen,年齡(age)爲25的數據篩選出來,而且在結果中不顯示ID列:

db.user.find({"addr":"ShenZhen","age":25},{"_id":0}).pretty()

查詢結果爲:

{ "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" }

範圍操做符

範圍操做符指的是:大於、大於等於、等於、不等於、小於、小於等於操做符,在 MongoDb 中它們的表示以及使用以下面表格所示:

操做 格式 範例 RDBMS中的相似語句
等於 {:} db.col.find({"by":"MongoDb入門教程"}).pretty() where by = 'MongoDb入門教程'
小於 {:{$lt:}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小於或等於 {:{$lte:}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大於 {:{$gt:}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大於或等於 {:{$gte:}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等於 {:{$ne:}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

例如我要查詢用戶表中全部年齡大於等於25歲的用戶,那麼查詢語句爲:

db.user.find({"age": {$gte:25}},{"_id":0}).pretty()

查詢結果爲:

{ "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "name" : "LiQiLiang", "age" : 27, "addr" : "GuangZhou" } { "name" : "XiaoPai", "age" : 30, "addr" : "BeiJing" } { "name" : "YuChangHui", "age" : 32, "addr" : "FuJian" } { "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

AND操做符

MongoDB 的 find() 方法能夠傳入多個鍵(key),每一個鍵(key)以逗號隔開。每一個鍵(key)之間是與的邏輯關係。

例如我要查詢用戶表(user)中地址爲ShenZhen且年齡大於等於25歲的用戶,那麼查詢語句爲:

db.user.find({"addr": "ShenZhen","age": {$gte:25}},{"_id":0}).pretty()

查詢結果爲:

{ "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

OR操做符

MongoDB 中關鍵字$or表示或邏輯關係,其語法格式以下:

db.col.find(
   {
 $or: [ {key1: value1}, {key2:value2} ] } ).pretty()

例如我要查詢用戶表(user)中地址爲ShenZhen或者年齡大於等於30歲的用戶,那麼查詢語句爲:

db.user.find({$or:[{"addr":"ShenZhen"},{"age":{$gte:30}}]}).pretty()

查詢結果爲:

{
    "_id" : ObjectId("59ac1c57dca9453471d67f15"), "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "_id" : ObjectId("59ac1c57dca9453471d67f17"), "name" : "XiaoPai", "age" : 30, "addr" : "BeiJing" } { "_id" : ObjectId("59ac1c57dca9453471d67f18"), "name" : "YuChangHui", "age" : 32, "addr" : "FuJian" } { "_id" : ObjectId("59ac1c57dca9453471d67f19"), "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

AND操做符和OR操做符能夠混合使用,例如要實現如下SQL查詢:

select * from user where name = "ChenYuRong" or (age <= 25 and addr == "JieYang")

那麼該 MongoDb 查詢語句應該這樣寫:

db.user.find({$or:[{"name":"ChenYuRong"}, {"age": {$lte:25}, "addr": "JieYang"}]}).pretty()

查詢結果爲:

{
    "_id" : ObjectId("59ac1c57dca9453471d67f15"), "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "_id" : ObjectId("59ac1c57dca9453471d67f1a"), "name" : "AnQi", "age" : 20, "addr" : "JieYang" }

排序

在 MongoDB 中使用使用 sort() 方法對數據進行排序,sort() 方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而-1是用於降序排列。

sort()方法基本語法以下所示:

db.collection.find().sort({KEY:1})

其中KEY表示要進行排序的字段。

例如咱們將全部年齡小於30歲的用戶查詢出來並將其按照年齡升序排列:

db.user.find({"age":{$lt:30}}).sort({age:1}).pretty()

查詢結果爲:

{
    "_id" : ObjectId("59ac1c57dca9453471d67f1a"), "name" : "AnQi", "age" : 20, "addr" : "JieYang" } { "_id" : ObjectId("59ac1c57dca9453471d67f15"), "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "_id" : ObjectId("59ac1c57dca9453471d67f16"), "name" : "LiQiLiang", "age" : 27, "addr" : "GuangZhou" } { "_id" : ObjectId("59ac1c57dca9453471d67f19"), "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

聚合

MongoDB中聚合的方法使用aggregate(),其基本的語法格式以下:

db.collection.aggregate(AGGREGATE_OPERATION)

其中AGGREGATE_OPERATION的格式爲:

[
    {
        $group: {
            _id: {
                addr: '$addr'
            },
            totalCount: {
                $sum: 1 } } } ]
  • $group是固定的,表示這裏一個分組聚合操做。
  • _id表示須要根據哪一些列進行聚合,其實一個JSON對象,其key/value對分別表示結果列的別名以及須要聚合的的數據庫列。
  • totaoCount表示聚合列的列名。
  • $sum表示要進行的聚合操做,後面的1表示每次加1。

例如要根據地區統計用戶人數,那麼查詢語句爲:

db.user.aggregate([{$group:{_id:{userAddr:'$addr'},totalCount:{$sum:1}}}])

查詢結果爲:

{ "_id" : { "userAddr" : "FuJian" }, "totalCount" : 1 } { "_id" : { "userAddr" : "JieYang" }, "totalCount" : 1 } { "_id" : { "userAddr" : "BeiJing" }, "totalCount" : 1 } { "_id" : { "userAddr" : "GuangZhou" }, "totalCount" : 1 } { "_id" : { "userAddr" : "ShenZhen" }, "totalCount" : 2 }

MongoDb更新數據

update() 方法用於更新已存在的文檔。語法格式以下:

db.collection.update(
   <query>, <update>, {  upsert: <boolean>,  multi: <boolean>,  writeConcern: <document> } )
  • query:對哪些數據進行更新操做。
  • update:對這些數據作什麼操做。
  • upsert(可選):若是不存在update的記錄,是否將其做爲記錄插入。true爲插入,默認是false,不插入。
  • multi(可選):是否更新多條記錄。MongoDb 默認是false,只更新找到的第一條記錄。若是這個參數爲true,就把按條件查出來多條記錄所有更新。
  • writeConcern(可選):表示拋出異常的級別。

例如咱們更新user表名爲chenyurong的記錄,將其年齡更改成25歲。

db.user.update({'name':'chenyurong'},{$set:{'age':25}})

其中$set表示進行賦值操做。

MongoDb刪除數據

MongoDB中聚合的方法使用remove(),其基本的語法格式以下:

db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
  • query(可選):刪除的文檔的條件。
  • justOne(可選):若是設爲 true 或 1,則只刪除一個文檔。
  • writeConcern(可選):拋出異常的級別。

例如咱們想刪除名字(name)爲LiQiLiang的用戶,那麼該刪除語句爲:

> db.user.remove({"name":"LiQiLiang"}) WriteResult({ "nRemoved" : 1 }) > db.user.find({"name":"LiQiLiang"}).pretty() > 

若是你想刪除全部數據,可使用如下方式(相似常規 SQL 的 truncate 命令):

>db.col.remove({}) >db.col.find() >

經常使用的DDL命令

  • 查看當前數據庫:db
  • 查看全部數據庫:show dbs
  • 查看當前數據庫全部集合(表格):show collections

MongoDb圖形化工具

若是你是企業版的用戶,能夠嘗試使用:企業版用戶:MongoDb Compass

若是你跟我同樣是我的用戶,並且也同樣使用 JetBrain 編輯器,那麼你能夠試試 JetBrain 的一款插件:JetBrain Plugin:mongo4idea

另外的一款 GUI 圖形化工具能夠做爲備用工具使用:NoSQL for MongoDb(Windows使用)

總結

此次咱們從服務器的安裝到鏈接,再介紹瞭如 MongoDb 最基本的 CURD 操做。

看到這裏是否是以爲 MongoDb 仍是蠻簡單的呢,來動手作作幾道題看是否真的徹底掌握了吧。

  • 查詢出user表中用戶年齡小於25歲的用戶,並按照年齡升序排列。
  • 查詢出user表中用戶年齡大於25歲而且地址在深圳的用戶。
  • 查詢出user表中用戶年齡大於25歲而且地址在深圳,或者地址在北京的用戶。
  • 統計出user表中各個城市的用戶人數。

若是遇到問題,記得在文章下評論哦。

參考資料

文章首發於【博客園-陳樹義】,點擊跳轉到原文MongoDb入門教程

相關文章
相關標籤/搜索