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 x64
版本安裝,下載地址:www.mongodb.com/download-ce…mongo.exe
能夠運行MongoDB自帶客戶端,操做MongoDB;cmd
工具,並輸入以下命令。sc.exe delete MongoDB
複製代碼
docker pull mongo:4.2.5
複製代碼
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5
複製代碼
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5 --auth
複製代碼
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
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
複製代碼
dropDatabase()
方法來刪除;> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
複製代碼
createCollection()
方法來建立集合,例如建立一個article
集合;> use test
switched to db test
> db.createCollection("article")
{ "ok" : 1 }
> show collections
article
複製代碼
drop()
方法來刪除集合,例如刪除一個article
集合;> db.article.drop()
true
> show collections
複製代碼
上面的數據庫和集合操做是在MongoDB的客戶端中進行的,下面的文檔操做都是在Robomongo中進行的。docker
insert()
方法向集合中插入文檔,語法以下;db.collection.insert(document)
複製代碼
insert()
方法來插入文檔,例如插入一個article
文檔;db.article.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by: 'Andy',
url: 'https://www.mongodb.com/',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
複製代碼
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
}
複製代碼
update()
來更新集合中的文檔,語法以下;db.collection.update(
<query>,
<update>,
{
multi: <boolean>
}
)
# query:修改的查詢條件,相似於SQL中的WHERE部分
# update:更新屬性的操做符,相似與SQL中的SET部分
# multi:設置爲true時會更新全部符合條件的文檔,默認爲false只更新找到的第一條
複製代碼
MongoDB 教程
的全部文檔的title修改成MongoDB
;db.article.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
複製代碼
update()
方法之外,save()
方法能夠用來替換已有文檔,語法以下;db.collection.save(document)
複製代碼
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
})
複製代碼
remove()
方法來刪除集合中的文檔,語法以下;db.collection.remove(
<query>,
{
justOne: <boolean>
}
)
# query:刪除的查詢條件,相似於SQL中的WHERE部分
# justOne:設置爲true只刪除一條記錄,默認爲false刪除全部記錄
複製代碼
MongoDB 教程
的全部文檔;db.article.remove({'title':'MongoDB 教程'})
複製代碼
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
}
複製代碼
操做 | 格式 | 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 |
MongoDB 教程
的全部文檔;db.article.find({'title':'MongoDB 教程'})
複製代碼
db.article.find({'likes':{$gt:50}})
複製代碼
find()
方法傳入多個鍵,以逗號隔開來實現,例如查詢title爲MongoDB 教程
而且by爲Andy
的全部文檔;db.article.find({'title':'MongoDB 教程','by':'Andy'})
複製代碼
$or
操做符實現,例如查詢title爲Redis 教程
或MongoDB 教程
的全部文檔;db.article.find({$or:[{"title":"Redis 教程"},{"title": "MongoDB 教程"}]})
複製代碼
Redis 教程
或者"MongoDB 教程
的全部文檔。db.article.find({"likes": {$gt:50}, $or: [{"title": "Redis 教程"},{"title": "MongoDB 教程"}]})
複製代碼
limit()
方法,語法以下;db.collection.find().limit(NUMBER)
複製代碼
db.article.find().limit(2)
複製代碼
skip()
方法,語法以下;db.collection.find().limit(NUMBER).skip(NUMBER)
複製代碼
db.article.find().limit(2).skip(1)
複製代碼
sort()
方法對數據進行排序,sort()
方法經過參數來指定排序的字段,並使用1和-1來指定排序方式,1爲升序,-1爲降序;db.collection.find().sort({KEY:1})
複製代碼
db.article.find().sort({likes:-1})
複製代碼
索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。數據庫
MongoDB使用createIndex()
方法來建立索引,語法以下;bash
db.collection.createIndex(keys, options)
# background:建索引過程會阻塞其它數據庫操做,設置爲true表示後臺建立,默認爲false
# unique:設置爲true表示建立惟一索引
# name:指定索引名稱,若是沒有指定會自動生成
複製代碼
db.article.createIndex({"title":1,"description":-1}, {background: true})
複製代碼
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
}
]
複製代碼
aggregate()
方法,相似於SQL中的group by語句,語法以下;db.collection.aggregate(AGGREGATE_OPERATION)
複製代碼
操做符 | 描述 |
---|---|
$sum | 計算總和 |
$avg | 計算平均值 |
$min | 計算最小值 |
$max | 計算最大值 |
db.article.aggregate([{$group : {_id : "$by", sum_count : {$sum : 1}}}])
複製代碼
/* 1 */
{
"_id" : "Andy",
"sum_count" : 2.0
}
/* 2 */
{
"_id" : "Ruby",
"sum_count" : 1.0
}
複製代碼
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"}})
複製代碼
mall項目全套學習教程連載中,關注公衆號第一時間獲取。