MongoDB快速入門,掌握這些剛恰好!

SpringBoot實戰電商項目mall(30k+star)地址:github.com/macrozheng/…git

摘要

雖然說如今關係型數據庫仍是主流,可是面對某些需求的時候,須要非關係型數據庫來補充它,學習一個主流的NoSQL數據庫仍是頗有必要的。MongoDB是一個功能豐富的NoSQL數據庫,本文整理了它最經常使用的部分造成了這篇入門教程,但願對你們有所幫助。github

簡介

MongoDB是一個基於分佈式文件存儲的數據庫。由C++語言編寫,旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介於關係型數據庫和非關係型數據庫之間的產品,是非關係型數據庫當中功能最豐富,最像關係型數據庫的。正則表達式

安裝

之前寫的MongoDB安裝教程是基於3.2版本的,發現有的朋友使用新版本安裝有問題,此次咱們使用最新版本再來安裝一次,本文所使用的MongoDB版本爲4.2.5,總的來講,新版本的安裝更簡單了。redis

Windows下的安裝

  • 運行MongoDB安裝包並選擇自定義安裝,設置好安裝路徑;

  • 配置MongoDB,讓MongoDB做爲服務運行,並配置好數據目錄和日誌目錄;

  • 取消MongoDB Compass的安裝選項(不取消安裝極慢),須要可自行安裝;

  • 雙擊mongo.exe能夠運行MongoDB自帶客戶端,操做MongoDB;

  • 鏈接成功後會顯示以下信息;

  • 若是須要移除MongoDB服務,只需使用管理員權限運行cmd工具,並輸入以下命令。
sc.exe delete MongoDB
複製代碼

Linux下的安裝

  • 下載MongoDB的Docker鏡像;
docker pull mongo:4.2.5
複製代碼
  • 使用Docker命令啓動MongoDB服務;
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5
複製代碼
  • 有時候咱們須要爲MongoDB設置帳號,可使用以下命令啓動;
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5 --auth
複製代碼
  • 而後咱們須要進入容器中的MongoDB客戶端;
docker exec -it mongo mongo
複製代碼
  • 以後在admin集合中建立一個帳號用於鏈接,這裏建立的是基於root角色的超級管理員賬號;
use admin
db.createUser({ 
    user: 'mongoadmin', 
    pwd: 'secret', 
    roles: [ { role: "root", db: "admin" } ] });
複製代碼
  • 建立完成後驗證是否能夠登陸;
db.auth("mongoadmin","secret")
複製代碼
  • 整個帳號建立過程能夠參考下圖。

客戶端工具

MongoDB的客戶端工具備不少,上面沒安裝的MongoDB Compass就是其中之一,另外Navicat 15版本也有MongoDB的管理功能。這裏咱們使用的是一款免費的客戶端工具Robo 3T(之前叫Robomongo)。sql

  • 下載完成後解壓,雙擊robo3t.exe便可使用;

  • 以後建立一個到MongoDB的鏈接;

  • 建立鏈接成功之後,就能夠操做MongoDB了。

相關概念

MongoDB是非關係型數據庫當中最像關係型數據庫的,因此咱們經過它與關係型數據庫的對比,來了解下它的概念。mongodb

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

數據庫操做

  • 建立數據庫,使用use命令去建立數據庫,當插入第一條數據時會建立數據庫,例如建立一個test數據庫;
> use test
switched to db test
> db.article.insert({name:"MongoDB 教程"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
複製代碼
  • 刪除數據庫,使用db對象中的dropDatabase()方法來刪除;
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
複製代碼

集合操做

  • 建立集合,使用db對象中的createCollection()方法來建立集合,例如建立一個article集合;
> use test
switched to db test
> db.createCollection("article")
{ "ok" : 1 }
> show collections
article
複製代碼
  • 刪除集合,使用collection對象的drop()方法來刪除集合,例如刪除一個article集合;
> db.article.drop()
true
> show collections
複製代碼

文檔操做

上面的數據庫和集合操做是在MongoDB的客戶端中進行的,下面的文檔操做都是在Robomongo中進行的。docker

插入文檔

  • MongoDB經過collection對象的insert()方法向集合中插入文檔,語法以下;
db.collection.insert(document)
複製代碼
  • 使用collection對象的insert()方法來插入文檔,例如插入一個article文檔;
db.article.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 數據庫',
    by: 'Andy',
    url: 'https://www.mongodb.com/',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})
複製代碼
  • 使用collection對象的find()方法能夠獲取文檔,例如獲取全部的article文檔;
db.article.find({})
複製代碼
{
    "_id" : ObjectId("5e9943661379a112845e4056"),
    "title" : "MongoDB 教程",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "Andy",
    "url" : "https://www.mongodb.com/",
    "tags" : [ 
        "mongodb", 
        "database", 
        "NoSQL"
    ],
    "likes" : 100.0
}
複製代碼

更新文檔

  • MongoDB經過collection對象的update()來更新集合中的文檔,語法以下;
db.collection.update(
   <query>,
   <update>,
   {
     multi: <boolean>
   }
)
# query:修改的查詢條件,相似於SQL中的WHERE部分
# update:更新屬性的操做符,相似與SQL中的SET部分
# multi:設置爲true時會更新全部符合條件的文檔,默認爲false只更新找到的第一條
複製代碼
  • 將title爲MongoDB 教程的全部文檔的title修改成MongoDB
db.article.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
複製代碼
  • 除了update()方法之外,save()方法能夠用來替換已有文檔,語法以下;
db.collection.save(document)
複製代碼
  • 此次咱們將ObjectId爲5e9943661379a112845e4056的文檔的title改成MongoDB 教程
db.article.save({
    "_id" : ObjectId("5e9943661379a112845e4056"),
    "title" : "MongoDB 教程",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "Andy",
    "url" : "https://www.mongodb.com/",
    "tags" : [ 
        "mongodb", 
        "database", 
        "NoSQL"
    ],
    "likes" : 100.0
})
複製代碼

刪除文檔

  • MongoDB經過collection對象的remove()方法來刪除集合中的文檔,語法以下;
db.collection.remove(
   <query>,
   {
     justOne: <boolean>
   }
)
# query:刪除的查詢條件,相似於SQL中的WHERE部分
# justOne:設置爲true只刪除一條記錄,默認爲false刪除全部記錄
複製代碼
  • 刪除title爲MongoDB 教程的全部文檔;
db.article.remove({'title':'MongoDB 教程'})
複製代碼

查詢文檔

  • MongoDB經過collection對象的find()方法來查詢文檔,語法以下;
db.collection.find(query, projection)
# query:查詢條件,相似於SQL中的WHERE部分
# projection:可選,使用投影操做符指定返回的鍵
複製代碼
  • 查詢article集合中的全部文檔;
db.article.find()
複製代碼
/* 1 */
{
    "_id" : ObjectId("5e994dcb1379a112845e4057"),
    "title" : "MongoDB 教程",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "Andy",
    "url" : "https://www.mongodb.com/",
    "tags" : [ 
        "mongodb", 
        "database", 
        "NoSQL"
    ],
    "likes" : 50.0
}

/* 2 */
{
    "_id" : ObjectId("5e994df51379a112845e4058"),
    "title" : "Elasticsearch 教程",
    "description" : "Elasticsearch 是一個搜索引擎",
    "by" : "Ruby",
    "url" : "https://www.elastic.co/cn/",
    "tags" : [ 
        "elasticearch", 
        "database", 
        "NoSQL"
    ],
    "likes" : 100.0
}

/* 3 */
{
    "_id" : ObjectId("5e994e111379a112845e4059"),
    "title" : "Redis 教程",
    "description" : "Redis 是一個key-value數據庫",
    "by" : "Andy",
    "url" : "https://redis.io/",
    "tags" : [ 
        "redis", 
        "database", 
        "NoSQL"
    ],
    "likes" : 150.0
}
複製代碼
  • MongoDB中的條件操做符,經過與SQL語句的對比來了解下;
操做 格式 SQL中的相似語句
等於 {<key>:<value>} where title = 'MongoDB 教程'
小於 {<key>:{$lt:<value>}} where likes < 50
小於或等於 {<key>:{$lte:<value>}} where likes <= 50
大於 {<key>:{$gt:<value>}} where likes > 50
大於或等於 {<key>:{$gte:<value>}} where likes >= 50
不等於 {<key>:{$ne:<value>}} where likes != 50
  • 條件查詢,查詢title爲MongoDB 教程的全部文檔;
db.article.find({'title':'MongoDB 教程'})
複製代碼
  • 條件查詢,查詢likes大於50的全部文檔;
db.article.find({'likes':{$gt:50}})
複製代碼
  • AND條件能夠經過在find()方法傳入多個鍵,以逗號隔開來實現,例如查詢title爲MongoDB 教程而且by爲Andy的全部文檔;
db.article.find({'title':'MongoDB 教程','by':'Andy'})
複製代碼
  • OR條件能夠經過使用$or操做符實現,例如查詢title爲Redis 教程MongoDB 教程的全部文檔;
db.article.find({$or:[{"title":"Redis 教程"},{"title": "MongoDB 教程"}]})
複製代碼
  • AND 和 OR條件的聯合使用,例如查詢likes大於50,而且title爲Redis 教程或者"MongoDB 教程的全部文檔。
db.article.find({"likes": {$gt:50}, $or: [{"title": "Redis 教程"},{"title": "MongoDB 教程"}]})
複製代碼

其餘操做

Limit與Skip操做

  • 讀取指定數量的文檔,可使用limit()方法,語法以下;
db.collection.find().limit(NUMBER)
複製代碼
  • 只查詢article集合中的2條數據;
db.article.find().limit(2)
複製代碼
  • 跳過指定數量的文檔來讀取,可使用skip()方法,語法以下;
db.collection.find().limit(NUMBER).skip(NUMBER)
複製代碼
  • 從第二條開始,查詢article集合中的2條數據;
db.article.find().limit(2).skip(1)
複製代碼

排序

  • 在MongoDB中使用sort()方法對數據進行排序,sort()方法經過參數來指定排序的字段,並使用1和-1來指定排序方式,1爲升序,-1爲降序;
db.collection.find().sort({KEY:1})
複製代碼
  • 按article集合中文檔的likes字段降序排列;
db.article.find().sort({likes:-1})
複製代碼

索引

  • 索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。數據庫

  • MongoDB使用createIndex()方法來建立索引,語法以下;bash

db.collection.createIndex(keys, options)
# background:建索引過程會阻塞其它數據庫操做,設置爲true表示後臺建立,默認爲false
# unique:設置爲true表示建立惟一索引
# name:指定索引名稱,若是沒有指定會自動生成
複製代碼
  • 給title和description字段建立索引,1表示升序索引,-1表示降序索引,指定之後臺方式建立;
db.article.createIndex({"title":1,"description":-1}, {background: true})
複製代碼
  • 查看article集合中已經建立的索引;
db.article.getIndexes()
複製代碼
/* 1 */
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.article"
    },
    {
        "v" : 2,
        "key" : {
            "title" : 1.0,
            "description" : -1.0
        },
        "name" : "title_1_description_-1",
        "ns" : "test.article",
        "background" : true
    }
]
複製代碼

聚合

  • MongoDB中的聚合使用aggregate()方法,相似於SQL中的group by語句,語法以下;
db.collection.aggregate(AGGREGATE_OPERATION)
複製代碼
  • 聚合中經常使用操做符以下;
操做符 描述
$sum 計算總和
$avg 計算平均值
$min 計算最小值
$max 計算最大值
  • 根據by字段聚合文檔並計算文檔數量,相似與SQL中的count()函數;
db.article.aggregate([{$group : {_id : "$by", sum_count : {$sum : 1}}}])
複製代碼
/* 1 */
{
    "_id" : "Andy",
    "sum_count" : 2.0
}

/* 2 */
{
    "_id" : "Ruby",
    "sum_count" : 1.0
}
複製代碼
  • 根據by字段聚合文檔並計算likes字段的平局值,相似與SQL中的avg()語句;
db.article.aggregate([{$group : {_id : "$by", avg_likes : {$avg : "$likes"}}}])
複製代碼
/* 1 */
{
    "_id" : "Andy",
    "avg_likes" : 100.0
}

/* 2 */
{
    "_id" : "Ruby",
    "avg_likes" : 100.0
}
複製代碼

正則表達式

  • MongoDB使用$regex操做符來設置匹配字符串的正則表達式,能夠用來模糊查詢,相似於SQL中的like操做;elasticsearch

  • 例如查詢title中包含教程的文檔;

db.article.find({title:{$regex:"教程"}})
複製代碼
  • 不區分大小寫的模糊查詢,使用$options操做符;
db.article.find({title:{$regex:"elasticsearch",$options:"$i"}})
複製代碼

結合SpringBoot使用

具體參考:《mall整合Mongodb實現文檔操做》

公衆號

mall項目全套學習教程連載中,關注公衆號第一時間獲取。

公衆號圖片
相關文章
相關標籤/搜索