MongoDB 安裝及文檔的基本操做

前言

MongoDB 是一個基於分佈式文件存儲的半結構化的非關係型數據庫。在海量數據中,能夠較高性能的處理存取操做。它是以 BSON 格式進行數據存儲(相似 JSON 格式,但類型更爲豐富),所以對於複雜的數據類型,能夠較輕鬆的保存和處理。同時,在非關係型數據庫陣容中,相比其餘數據庫產品,它擁有更豐富的功能,而且與關係型數據庫類型,因此對於新手使用也能快速上手。linux

安裝

環境:CentOS 7 版本號:4.2.6 企業版 版本:免安版(TGZ)web

安裝包

訪問官網連接下載連接:https://www.mongodb.com/download-center/enterpriseredis

我這裏使用的是企業版,下載選項如圖:mongodb

下載後獲得壓縮包 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 中。bash

建立配置前,先建立 data、log、run 三個目錄,分別對應的數據存儲目錄、日誌目錄、進程 ID 保存目錄websocket

> mkdir -p /var/mongodb/data
> mkdir -p /var/mongodb/log
> mkdir -p /var/mongodb/run

建立 mongod.conf 在 /var/mongodb 目錄中,內容以下:負載均衡

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/mongodb/log/mongo.log # 日誌文件路徑設置

# Where and how to store data.
storage:
  dbPath: /var/mongodb/data # 數據存儲路徑
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/mongodb/run/mongod.pid  # location of pidfile  
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017 # 端口號
  bindIp: 127.0.0.1  # 監聽 IP ,便可訪問 IP,默認是本機


security:
  authorization: enabled
  
#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

配置文件經常使用基本屬性:socket

屬性 說明
systemLog#destination 日誌輸出位置,file 或 syslog,使用 file 時,必須指定 path
systemLog#logAppend 當實例啓動時日誌是否追加寫入到現有日誌中
systemLog#path 日誌存放路徑
storage#dbPath 數據存儲路徑
storage#journal#enabled 日誌是否永久性,能夠用來恢復數據
processManagement#fork 是否後臺運行服務
processManagement#pidFilePath pid 文件的存儲路徑
processManagement#timeZoneInfo 數據庫使用的時區路徑
net#port 數據使用的端口
net#bindIp 監聽客戶端鏈接的 IP,便可訪問的 IP
security#authorization 是否啓動權限管控

服務啓停

將解壓後的安裝包 bin 路徑添加到環境變量 /etc/profile 中,在 PATH 上進行追加

# mongoDB
PATH=$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 對象。

MongoDB 關係型數據庫
Database(數據庫) Database(數據庫)
Collection(集合) Table(表)
Document(文檔) Row(行)
Field(字段) Column(列)

Database 的操做

數據建立和選擇,都是使用use db命令

查看全部數據庫

> show dbs

刪除數據庫,先選擇再刪除

> use db
> db.dropDatabase()

Collection 的操做

建立集合命令,同時,若是沒有先建立集合,插入數據時會自動建立集合

> 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(
    <document>,
    {
        writeConcern: <document>
    }
)

指令 insertOne() 中參數:

  • document 參數爲 插入的 BSON 數據
  • writeConcern 爲寫入策略,是可選參數

向 MongoDB 的 ytao 數據庫中,插入一條 article 集合的數據

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(
    [<document 1>, <document 2>],
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
)

參數ordered爲是否有序插入文檔,可選參數,默認 true。

向 MongoDB 的 ytao 數據庫中,插入了兩條 article 集合的數據

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

insert() 能夠插入單個或多個文檔,這個也是最較爲經常使用的方法,其語法爲

db.collect.insert(
    <document> or [<document 1>, <document 2>],
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
)

插入的文檔若是是單個,則相似 insertOne() 的插入方式;若是插入的文檔是多個,則相似 insertMany() 的插入方式。其中參數 writeConcern 和 ordered 都是同樣。

save

save() 也能夠進行數據插入,當新插入的 _id 存在時,會將已存在的文檔進行覆蓋,若是 _id 不存在時,則相似 insertOne() 的方式插入。其操做語法:

db.collect.save(
    <document>,
    {
        writeConcern: <document>
    }
)

更新

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

update

經過 update() 能夠更新一個或多個文檔,其語法:

db.collection.update(
    <query>,
    <update>,
    {
        upsert: <boolean>,
        multi: <boolean>,
        writeConcern <document>,
        collation: <document>,
        arrayFilters: [<filter1>,<filter2>]
    }
)

update 的參數:

  • query:要更新文檔的查詢條件
  • update:要更新的字段
  • upsert:默認爲 false。當設置 true 時,若是更新的條件沒有匹配到數據時,則插入此更新條件。反之,設爲 false 時,則不插入。
  • multi:默認爲 false。當查詢條件匹配到多條數據時,若是設置爲 true,則會更新全部匹配的數據;若是設置爲 false,則更新匹配出的第一條數據。
  • writeConcern:和上面 insert 的參數同樣。
  • collation:更新數據的排序規則。
  • 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(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string> 
   }
)

hint4.2.1版本中新增的參數,用於指定更新文檔的索引。

updateMany

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

語法:

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string> 
   }
)

replaceOne

replaceOne 將一個文檔徹底覆蓋,而且不須要指定 _id。只能覆蓋一個文檔。

語法:

db.collection.replaceOne(
   <filter>,
   <replacement>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     hint: <document|string> 
   }
)

save

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

刪除

刪除文檔的方法有 deleteOne()、deleteMany()、remove()

deleteOne

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

db.collection.deleteOne(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

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

deleteMany

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

db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

remove

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

db.collection.remove(
   <query>,
   <justOne>
)

或者

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>,
     collation: <document>
   }
)

justOne參數默認爲 false,表示刪除所有匹配到的數據;true 表示只刪除第一個文檔

查詢

MongoDB 中經常使用的基本查詢有 ** findOne() ** 和 ** find() **。

findOne

findOne() 只返回匹配到的第一個文檔,語法爲:

db.collection.findOne(
    <query>, 
    <projection>

)

參數說明:

  • query 表示查詢條件。
  • projection 表示返回的字段(Field)。

下面查詢一個文檔,而且只返回titleurl

經過指定字段的 value 爲 1,即表示查詢後返回的字段。

find

find() 是返回全部匹配到的集合,語法爲:

db.collection.find(
    <query>, 
    <projection>

)

下面案例查詢查詢結果:

總結

本文對 MongoDB 的入門和基本操做進行了簡單的瞭解,在這使用過程當中,有點相似關係型數據庫操做的影子,因此對有關係型數據庫使用經驗的人,上手是較爲簡單的。

更多使用操做,官方文檔:https://docs.mongodb.com/manual/reference/

推薦閱讀

《ElasticSearch之安裝及基本操做API》

《Redis5新特性Streams做消息隊列》

《基於Docker實現MySQL主從複製》

《Java 線程通訊之 wait/notify 機制》

關注公衆號 『ytao』 堅持原創技術文章輸出,專一但不限於 Java 相關技術。

個人公衆號

相關文章
相關標籤/搜索