MongoDB 安裝及文檔的基本操作

2020-06-17     segmentfault官方

原標題:MongoDB 安裝及文檔的基本操作

本文轉載於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(,{writeConcern: })

指令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([, ],{writeConcern: ,ordered: })

參數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( or [, ],{writeConcern: ,ordered: })

插入的文檔如果是碎片,則類似insertOne的插入方式;如果插入的文檔是多個,則類似insertMany的插入方式。其中,參數writeConcern和ordered都是一樣。

save也可以進行數據插入,當新插入的_id存在時,轉換已存在的文檔進行覆蓋,如果_id不存在時,則類似insertOne的方式插入。其操作語法:

db.collect.save(,{writeConcern: })

更新

進行更新的方法有updateOne,updateMany,update,replaceOne以及save。其中,update包括updateOne和updateMany的功能。

更新

通過update可以更新一個或多個文檔,其語法:

db.collection.update(,,{upsert: ,multi: ,writeConcern ,collation: ,arrayFilters: [,]})

更新的參數:

  • 查詢:要更新文檔的查詢條件

  • 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(,,{upsert: ,writeConcern: ,collation: ,arrayFilters: [ , ... ],hint: })

hint是4.2.1版本中添加的參數,用於指定更新文檔的索引。

updateMany

updateMany同樣和update更新多個文檔使用一樣。

語法:

db.collection.updateMany(,,{upsert: ,writeConcern: ,collation: ,arrayFilters: [ , ... ],hint: })

replaceOne

replaceOne將一個文檔完全覆蓋,並且不需要指定_id。只能覆蓋一個文檔。

語法:

db.collection.replaceOne(,,{upsert: ,writeConcern: ,collation: ,hint: })

save在更新中是指定_id的方式進行文檔覆蓋。即上文插入中的save用法。

刪除

刪除文檔的方法有deleteOne,deleteMany,remove

deleteOne

deleteOne一次只能刪除一個文檔,其語法:

db.collection.deleteOne(,{writeConcern: ,collation: })

filter為刪除文檔的過濾條件。

deleteMany

deleteMany一次可刪除多個匹配到的文檔,其語法:

db.collection.deleteMany(,{writeConcern: ,collation: })

去掉

remove是刪除查詢出的文檔,其語法有兩個:

db.collection.remove(,)

或者

db.collection.remove(,{justOne: ,writeConcern: ,collation: })

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 思否社區和文章作者展開更多互動和交流。

文章來源: https://twgreatdaily.com/zh-my/G1ofwXIBiuFnsJQVCyat.html

Flutter 知識點

2020-08-10