本文轉載於SegmentFault社區
作者:tao
前言
MongoDB是一個基於分布式文件存儲的半結構化的非關係型資料庫。在海量數據中,可以使用更高性能的處理訪問操作。它採用BSON格式進行數據存儲(類似JSON格式,但類型更為常規)同時,在非關係型資料庫平台中,各種其他資料庫產品,它擁有更豐富的功能,並且與關係型資料庫類型,所以對於新手使用也能快速上手。
安裝
安裝包環境:CentOS 7
版本號:4.2.6企業版
版本:免安版(TGZ)
訪問官網連結下載連結:https://www.mongodb.com/downloadcenter/enterprise
我這裡使用的是企業版,下載選項如下:
下載後得到壓縮包mongodb-linux-x86_64-enterprise-rhel70-4.2.6.tgz
將下載的壓縮包上傳至對應目錄,然後進行解壓
> tar -zxvf mongodb-linux-x86_64-enterprise-rhel70-4.2.6.tgz
配置文件
當前使用的是免安版,所以mongoDB的配置文件需要自己手動創建。如果使用的是安裝版,安裝後配置文件會在/etc/mongod.conf中。
創建配置前,先創建數據,日誌,運行三個目錄,分別對應的數據存儲目錄,日誌目錄,進程ID保存目錄
> mkdir -p /var/mongodb/data> mkdir -p /var/mongodb/log> mkdir -p /var/mongodb/run
在/ var / mongodb目錄中,創建內容mongod.conf,內容如下:
# mongod.conf
# for documentation of all options, see:# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.systemLog:destination: filelogAppend: truepath: /var/mongodb/log/mongo.log # 日誌文件路徑設置
# Where and how to store data.storage:dbPath: /var/mongodb/data # 數據存儲路徑journal:enabled: true# engine:# wiredTiger:
# how the process runsprocessManagement:fork: true # fork and run in backgroundpidFilePath: /var/mongodb/run/mongod.pid # location of pidfiletimeZoneInfo: /usr/share/zoneinfo
# network interfacesnet:port: 27017 # 埠號bindIp: 127.0.0.1 # 監聽 IP ,即可訪問 IP,默認是本機
security:authorization: enabled
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
配置文件常用基本屬性:
將解壓後的安裝包bin路徑添加到環境變量/ etc / profile中,在PATH上進行追加
# mongoDBPATH=$PATH:/usr/local/software/mongoDB/mongodb-linux-x86_64-enterprise-rhel70-4.2.6/bin
使用/var/mongodb/mongod.conf配置文件啟動:
> mongod -f /var/mongodb/mongodb.conf
如所示,則啟動成功
啟動完成後,驗證是否正常運行
> mongo
如果正常運行,則進入登錄頁面
創建帳號,並設置角色為root
> use admin> db.createUser({user:"xxxx",pwd:"xxxxxx",roles:["root"]})
設置帳號後,重新登錄,此時需要進行帳號權限校驗
> mongo -u accont -p password
停止MongoDB服務,必須切換到admin資料庫
> use admin> db.shutdownServer
基本操作
在介紹幾本操作之前,現將常用的MongoDB對象與關係型資料庫進行類比,以便更好地理解MongoDB對象。
數據創建和選擇,都是使用use db命令
查看所有資料庫
> show dbs
刪除資料庫,先選擇再刪除
> use db> db.dropDatabase
集合的操作
創建集合命令,同時,如果沒有先創建集合,插入數據時會自動創建集合
> db.createCollection(collectionName, [options])
其中options為任選參數,主要是數據的校驗規則,此處不展開分析。
查看資料庫中所有集合
> show collections
選擇集合
> db.getCollection(collectionName)或> db.collectionName
刪除集合
> db.collectionName.drop
插入
MongoDB插入方法有insertOne,insertMany,insert,save。其中insert功能就包括了insertOne和insertMany功能。
insertOne
insertOne是向資料庫中插入一個文檔,語法格式為:
db.collect.insertOne(
指令insertOne中參數:
document參數為插入的BSON數據
writeConcern為寫入策略,是可選參數
向MongoDB的ytao資料庫中,插入一條文章集合的數據
db.article.insertOne({title: "Dubbo 負載均衡的實現",url: "https://ytao.top/2020/05/02/23-dubbo-loadbalance/",author: "ytao"})
資料庫數據為:
注意:如果插入數據時,沒指定_id,則重新自動生成_id;如果指定_id,則必須_id在資料庫中存在,否則會報錯插入失敗。
insertMany
insertMany方法是一次插入多個文檔,語法格式為:
db.collect.insertMany([
參數ordered為是否有序插入文檔,可選參數,可選true。
向MongoDB的ytao資料庫中,插入了兩條文章集合的數據
db.article.insertMany([{title: "Netty中粘包/拆包處理",url: "https://ytao.top/2019/12/09/10-netty/",author: "ytao"},{title: "WebSocket實現Web端即時通信",url: "https://ytao.top/2019/11/17/7_websocket/",author: "ytao"}])
插入後的數據
同理,與insertOne相同,插入重複插入已存在的_id,否則報錯。
插
insert可以插入片段或多個文檔,這個也是最常見的方法,其語法為
db.collect.insert(
插入的文檔如果是碎片,則類似insertOne的插入方式;如果插入的文檔是多個,則類似insertMany的插入方式。其中,參數writeConcern和ordered都是一樣。
救
save也可以進行數據插入,當新插入的_id存在時,轉換已存在的文檔進行覆蓋,如果_id不存在時,則類似insertOne的方式插入。其操作語法:
db.collect.save(
更新
進行更新的方法有updateOne,updateMany,update,replaceOne以及save。其中,update包括updateOne和updateMany的功能。
更新
通過update可以更新一個或多個文檔,其語法:
db.collection.update(
更新的參數:
查詢:要更新文檔的查詢條件
update:要更新的長度
upsert:默認為false。當設置為時,如果更新的條件沒有匹配到數據時,則插入此更新條件。反之,創建false時,則不插入。
當查詢條件匹配到多條數據時,如果設置為true,則更新所有匹配的數據;如果設置為false,則更新匹配出的第一條數據。
writeConcern:和上面insert的參數一樣。
排序規則:更新數據的排序規則。
arrayFilters:更新數據中數組格式數據的某個特定元素。
接下來就演示兩個例子,一個普通更新,一個帶使用arrayFilters數據的更新,這個比較難說明,但通過示例就容易理解。
更新前數據:
{"_id" : ObjectId("5ed299cee89845fb9ec805e4"),"title" : "WebSocket實現Web端即時通信","url" : "https://ytao.top/2019/11/17/7_websocket/","author" : "ytao"}
案例一將author數據更新為["楊滔", "ytao"]
db.article.update({title: "WebSocket實現Web端即時通信"},{$set: {author: ["楊滔", "ytao"]}})
案例二將author數據["楊滔", "ytao"]的楊滔更新為YangTao
db.article.update({title: "WebSocket實現Web端即時通信"},{$set: {"author.$[idx]": "YangTao"}},{arrayFilters:[{"idx": {$eq: "楊滔"}}]})
上面idx表示副本中元素的位置。
更新後的數據
updateOne
updateOne只能更新一個文檔,和update使用類似,將multi參數更改為false一樣,這裡不再使用案例演示。
語法:
db.collection.updateOne(
hint是4.2.1版本中添加的參數,用於指定更新文檔的索引。
updateMany
updateMany同樣和update更新多個文檔使用一樣。
語法:
db.collection.updateMany(
replaceOne
replaceOne將一個文檔完全覆蓋,並且不需要指定_id。只能覆蓋一個文檔。
語法:
db.collection.replaceOne(
救
save在更新中是指定_id的方式進行文檔覆蓋。即上文插入中的save用法。
刪除
刪除文檔的方法有deleteOne,deleteMany,remove
deleteOne
deleteOne一次只能刪除一個文檔,其語法:
db.collection.deleteOne(
filter為刪除文檔的過濾條件。
deleteMany
deleteMany一次可刪除多個匹配到的文檔,其語法:
db.collection.deleteMany(
去掉
remove是刪除查詢出的文檔,其語法有兩個:
db.collection.remove(
或者
db.collection.remove(
justOne參數類型為false,表示刪除全部匹配到的數據;true表示只刪除第一個文檔
查詢
MongoDB中常用的基本查詢有findOne和find。
找一個
findOne只返回匹配到的第一個文檔,語法為:
db.collection.findOne(
)
參數說明:
query表示查詢條件。
projection表示返回的變量(Field)。
下面查詢一個文檔,title和只返回和url
通過指定細分的值為1,即表示查詢後返回的細分。
找
find是返回所有匹配到的集合,語法為:
db.collection.find(
)
以下案例查詢查詢結果:
總結
本文對MongoDB的入門和基本操作進行了簡單的了解,在這使用過程中,有點類似關係型資料庫操作的影子,所以對有關係型資料庫使用經驗的人,上手是多個簡單的。
更多使用操作,官方文檔:
https: //docs.mongodb.com/manual/reference/
ElasticSearch之安裝及基本操作API:
https://ytao.top/2019/12/14/11-elasticsearch/
Redis5新特性Streams作消息體內:
https://ytao.top/2020/01/06/14-redis-streams/
基於Docker實現MySQL主從複製:
https://ytao.top/2019/10/27/4_%E5%9F%BA%E4%BA%8EDocker%E5%AE%9E%E7%8E%B0MySQL%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/
Java線程通信之wait / notify機制:
https://ytao.top/2020/05/12/24-thread-wait-notify/
SegmentFault 思否社區和文章作者展開更多互動和交流。