摘要:在配置的時候使用絕對路徑替代相對路徑,有利于在排查故障時查找進程啟動的目錄。在添加授權用戶和開啟認證后,這些警告會自動消失。投影文檔中字段為或真值表示包含,或假值表示排除,可以設置多個字段為或,但不能混合使用。
MongoDB 是免費開源的跨平臺 NoSQL 數據庫,命名源于英文單詞 humongous,意思是「巨大無比」,可見開發組對 MongoDB 的定位。與關系型數據庫不同,MongoDB 的數據以類似于 JSON 格式的二進制文檔存儲:
{ name: "Angeladady", age: 18, hobbies: ["Steam", "Guitar"] }
文檔型的數據存儲方式有幾個重要好處:文檔的數據類型可以對應到語言的數據類型,如數組類型(Array)和對象類型(Object);文檔可以嵌套,有時關系型數據庫涉及幾個表的操作,在 MongoDB 中一次就能完成,可以減少昂貴的連接花銷;文檔不對數據結構加以限制,不同的數據結構可以存儲在同一張表。
MongoDB 的文檔數據模型和索引系統能有效提升數據庫性能;復制集功能提供數據冗余,自動化容災容錯,提升數據庫可用性;分片技術能夠分散單服務器的讀寫壓力,提高并發能力,提升數據庫的可拓展性。MongoDB 高性能,高可用性、可擴展性等特點,使其至 2009 年發布以來,逐漸被認可,并被越來越多的用于生產環境中。AWS、GCP、阿里云等云平臺都提供了十分便捷的 MongoDB 云服務。
開啟 MongoDB 之旅第一步,安裝 MongoDB。到官網下載壓縮包或安裝包,解壓或安裝后,可以把 bin 目錄添加到環境變量,方便后續命令的執行。在開始階段,要用到 mongo 和 mongod 兩個命令。文章示例以 Linux 為標準。
啟動實例第二步,通過 mongod 命令啟動實例。啟動之前,新建一個目錄來存放 mongoDB 的數據和日志:
mkdir mongoDB_example cd mongoDB_example mkdir bin data conf log touch log/mongodb.log
上面的命令創建了四個目錄:
bin 如果不打算把 mongodb 的命令放到環境變量,可以將常用命令復制到 bin 目錄,方便調用,如 mongo 和 mongod。也可以把編寫的腳本,如副本集的啟動腳本,放在 bin 目錄里
data 用來存放數據
log 用來存放日志文件
conf 用來存放配置文件
在項目目錄中,使用 mongod 命令來啟動 mongoDB 進程:
mongod --fork --port 12345 --dbpath datadb --logpath log/mongodb.log
上面命令中選項的意義:
port 指定端口
dbpath 指定數據存放路徑
logpath 指定日志存放路徑
fork 后臺運行(退出 shell 后進程不會被中斷了)
啟動順利的話,就可以輸入ps aux | grep mongod,查看到啟動的 mongod 實例。如果啟動沒有成功,最好先檢查下路徑設置和端口占用。
配置文件啟動實例相比設定選項來啟動實例,通過配置文件啟動更具有可維護性。在 conf 目錄下新建一個配置文件:
vi conf/mongodb.conf
配置文件使用的格式。接下來,把剛才的啟動配置輸入到配置文件中:
port = 12345 dbpath = data logpath = log/mongodb.log fork = true
啟動之前別忘了先殺掉之前啟動的實例kill -2
mongod -f conf/mongodb.conf
在沒有指定接口時,默認啟動在 27017 端口。在配置的時候使用絕對路徑替代相對路徑,有利于在排查故障時查找 mongoDB 進程啟動的目錄。
連接實例第三步,通過 mongo 命令來連接 mongoDB 實例:
mongo [options] [db address] [file names]
之前啟動實例的是在本地 12345 端口,安全模式未被開啟,所以不需要輸入用戶名和密碼即可直接連接:
mongo 127.0.0.1:12345
或者通過--host和--port選項指定主機和端口。一切順利的話,就進入了 mongoDB shell,shell 會報出一連串權限警告,不過不用擔心,這并不會影響之后的操作。在添加授權用戶和開啟認證后,這些警告會自動消失。
數據庫 CRUD 操作在進行增查改刪操作之前,先了解下常用的 shell 操作:
db 顯示當前所在數據庫,默認為 test
show dbs 列出可用數據庫
show tables show collections 列出數據庫中可用集合
use
mongoDB 預設有兩個數據庫,admin 和 local,admin 用來存放系統數據,local 用來存放該實例數據,在副本集中,一個實例的 local 數據庫對于其它實例是不可見的。使用 use 命令切換數據庫:
> use admin > use local > use newDatabase
可以 use 一個不存在的數據庫,當你存入新數據時,mongoDB 會創建這個數據庫:
> use newDatabase > db.newCollection.insert({x:1}) WriteResult({ "nInserted" : 1 })
以上命令向數據庫中插入一個文檔,返回 1 表示插入成功,mongoDB 自動創建 newCollection 集合和數據庫 newDatabase。下面將創建一個 drivers 集合,進行增查改刪操作。
創建(Create)MongoDB 提供 insert 方法創建新文檔:
db.collection.inserOne() 插入單個文檔
WriteResult({ "nInserted" : 1 })
db.collection.inserMany() 插入多個文檔
db.collection.insert() 插入單條或多條文檔
這里以 insert 方法為例:
> db.drivers.insert({name:"Chen1fa",age:18}) > db.drivers.insert({name:"Xiaose",age:35}) > db.drivers.insert({_id:91,name:"Sun1feng",age:34})
要注意,age:18和age:"18"是不一樣的,前者插入的是數值,后者插入的是字符串。插入新文檔如果未指定 _id,mongoDB 會自動為插入的文檔添加 _id 字段。使用 db.dirvers.find() 命令即可看到剛剛插入的文檔:
> db.dirvers.find() { "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 18 } { "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 } { "_id" : 91, "name" : "Sun1feng", "age" : 34 }查找(Read)
MongoDB 提供 find 方法查找文檔,第一個參數為查詢條件:
> db.drivers.find() #查找所有文檔 { "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 18 } { "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 } { "_id" : 91, "name" : "Sun1feng", "age" : 34 } > db.drivers.find({name: "Xiaose"}) #查找 name 為 Xiaose 的文檔 { "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 } > db.drivers.find({age:{$gt:20}}) #查找 age 大于 20 的文檔 { "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 } { "_id" : 91, "name" : "Sun1feng", "age" : 34 }
上述代碼中的$gt對應于大于號>的轉義。第二個參數可以傳入投影(projection,投影儀中,白色光源通過分光鏡、液晶板、投影鏡頭的光學變換后,投射到反射面上,顯示出了彩色圖像)文檔映射數據:
> db.drivers.find({age:{$gt:20}},{name:1}) { "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose" } { "_id" : 91, "name" : "Sun1feng" }
上述命令將查找 age 大于 20 的文檔,返回 name 字段,排除其它字段。投影文檔中字段為 1 或真值表示包含,0 或假值表示排除,可以設置多個字段為 1 或 0,但不能混合使用。
除此之外,還可以通過 count、skip、limit 等指針(Cursor)方法,改變文檔查詢的執行方式:
> db.drivers.find().count() #統計查詢文檔數目 3 > db.drivers.find().skip(1).limit(10).sort({age:1}) { "_id" : 91, "name" : "Sun1feng", "age" : 34 } { "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35 }
上述查找命令跳過 1 個文檔,限制輸出 10 個,以 name 子段正序排序(大于 0 為正序,小于 0 位反序)輸出結果。最后,可以使用 Cursor 方法中的 pretty 方法,提升查詢文檔的易讀性,特別是在查看嵌套的文檔和配置文件的時候:
> db.drivers.find().pretty()更新(Update)
MongoDB 提供 updata 方法更新文檔:
db.collection.updateOne() 更新最多一個符合條件的文檔
db.collection.updateMany() 更新所有符合條件的文檔
db.collection.replaceOne() 替代最多一個符合條件的文檔
db.collection.update() 默認更新一個文檔,可配置 multi 參數,跟新多個文檔
以 update() 方法為例。其格式:
> db.collection.update(, , { upsert: , multi: } )
各參數意義:
query 為查詢條件
update 為修改的文檔
upsert 為真,查詢為空時插入文檔
multi 為真,更新所有符合條件的文檔
下面的命令將 name 字段為 Chen1fa 的文檔,更新 age 字段為 30:
> db.drivers.update({name:"Chen1fa"},{name:"Chen1fa", age:30})
要注意的是,如果更新文檔只傳入 age 字段,那么文檔會被更新為{age: 30},而不是{name:"Chen1fa", age:30}。要避免文檔被覆蓋,需要用到 $set 指令,$set 僅替換或添加指定字段:
> db.drivers.update({name:"Chen1fa"},{$set:{age:30}})
如果要在查詢的文檔不存在的時候插入文檔,要把 upsert 參數設置真值:
> db.drivers.update({name:"Alen"},{age:24},{upsert: true})
update 方法默認情況只更新一個文檔,如果要更新符合條件的所有文檔,要把 multi 設為真值,并使用 $set 指令:
> db.drivers.update({age:{$gt:25}},{$set:{license:"A"}},{multi: true}) > db.drivers.update({age:{$lt:25}},{$set:{license:"C"}},{multi: true})
最終結果:
> db.dirvers.find() { "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 30, "license" : "A" } { "_id" : ObjectId("598964d456b8c69ae1e5f36b"), "name" : "Xiaose", "age" : 35, "license" : "A" } { "_id" : 91, "name" : "Sun1feng", "age" : 34, "license" : "A" } { "_id" : ObjectId("598968b3ed1eccef17e79abe"), "age" : 24, "license" : "C" }刪除(Delete)
MongoDB 提供了 delete 方法刪除文檔:
db.collection.deleteOne() 刪除最多一個符合條件的文檔
db.collection.deleteMany() 刪除所有符合條件的文檔
db.collection.remove() 刪除一個或多個文檔
以 remove 方法為例:
> db.drivers.remove({name:"Xiaose"}) #刪除所有 name 為 Xiaose 的文檔 > db.drivers.remove({age:{$gt:30}},{justOne:true}) #刪除所有 age 大于 30 的文檔 > db.drivers.find() { "_id" : ObjectId("598964bd56b8c69ae1e5f36a"), "name" : "Chen1fa", "age" : 30, "license" : "A" } { "_id" : ObjectId("598968b3ed1eccef17e79abe"), "age" : 24, "license" : "C" }
MongoDB 提供了 drop 方法刪除集合,返回 true 表面刪除集合成功:
> db.drivers.drop()后話
相比傳統關系型數據庫,MongoDB 的 CURD 操作更像是編寫程序,更符合開發人員的直覺,不過 MongoDB 同樣也支持 SQL 語言。MongoDB 的 CURD 引擎配合索引技術、數據聚合技術和 JavaScript 引擎,賦予 MongoDB 用戶更強大的操縱數據的能力。
關閉實例關閉 mongoDB 服務:
> use admin > db.shutdownServer()
使用 exit 或 Ctrl + C 斷開連接:
> exit結語
上述,我們啟動了一個不安全的 MongoDB 實例,應用到生產環境中,還需要了解 MongoDB 的安全機制,了解如何建立索引提升數據庫的讀寫速度。隨著數據的增長,需要了解副本集技術如何將多個實例部署到不同的服務器、了解分片技術對數據庫進行橫向擴展。為保證服務器性能和安全,需要了解如何對 MongoDB 進行測試和監控…
「冰封三尺,非一日之寒」,同樣,要想完全掌握 MongoDB 還有很長的路要走。愿戒驕戒躁,在學習的路上,與君共勉。
參考Wikipedia MongoDB
MongoDB introduction
MongoDB CRUD Operations
Imooc MongoDB series course - SeanZ
MongoDB University
怎樣學 MongoDB?- 知乎
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19060.html
摘要:單條記錄插入江蘇注意接下來的操作中會忽略掉數據庫連接操作,直接寫核心代碼,請自行補上。江蘇我們再隨便插入點兒數據供下面操作使用。江蘇北京上海王二麻廣東條件查詢只要將查詢條件當做參數塞入即可篩選數據。王二麻刪除全部數據慎用 Pymongo是python的一個操作Mongodb的庫。 下面我們直接簡列出一些常用操作命令。 連接數據庫 鏈接數據庫需要提供一個地址和接口即可。首先還是要導入包。...
摘要:單條記錄插入江蘇注意接下來的操作中會忽略掉數據庫連接操作,直接寫核心代碼,請自行補上。江蘇我們再隨便插入點兒數據供下面操作使用。江蘇北京上海王二麻廣東條件查詢只要將查詢條件當做參數塞入即可篩選數據。王二麻刪除全部數據慎用 Pymongo是python的一個操作Mongodb的庫。 下面我們直接簡列出一些常用操作命令。 連接數據庫 鏈接數據庫需要提供一個地址和接口即可。首先還是要導入包。...
摘要:在配置的時候使用絕對路徑替代相對路徑,有利于在排查故障時查找進程啟動的目錄。在添加授權用戶和開啟認證后,這些警告會自動消失。投影文檔中字段為或真值表示包含,或假值表示排除,可以設置多個字段為或,但不能混合使用。 MongoDB 是免費開源的跨平臺 NoSQL 數據庫,命名源于英文單詞 humongous,意思是「巨大無比」,可見開發組對 MongoDB 的定位。與關系型數據庫不同,Mo...
閱讀 953·2021-11-24 09:39
閱讀 2689·2021-09-26 09:55
閱讀 14154·2021-08-23 09:47
閱讀 3577·2019-08-30 15:52
閱讀 849·2019-08-29 13:49
閱讀 997·2019-08-23 18:00
閱讀 844·2019-08-23 16:42
閱讀 1635·2019-08-23 14:28