SpringBoot實戰電商項目mall(30k+star)地址: https://github.com/macrozheng/mall
雖然說如今關係型數據庫仍是主流,可是面對某些需求的時候,須要非關係型數據庫來補充它,學習一個主流的NoSQL數據庫仍是頗有必要的。MongoDB是一個功能豐富的NoSQL數據庫,本文整理了它最經常使用的部分造成了這篇入門教程,但願對你們有所幫助。git
MongoDB是一個基於分佈式文件存儲的數據庫。由C++語言編寫,旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介於關係型數據庫和非關係型數據庫之間的產品,是非關係型數據庫當中功能最豐富,最像關係型數據庫的。github
之前寫的MongoDB安裝教程是基於3.2版本的,發現有的朋友使用新版本安裝有問題,此次咱們使用最新版本再來安裝一次,本文所使用的MongoDB版本爲4.2.5,總的來講,新版本的安裝更簡單了。
Windows x64
版本安裝,下載地址:https://www.mongodb.com/downl...
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)。
robo3t.exe
便可使用;
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中進行的。
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})
createIndex()
方法來建立索引,語法以下;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 }
$regex
操做符來設置匹配字符串的正則表達式,能夠用來模糊查詢,相似於SQL中的like操做;教程
的文檔;db.article.find({title:{$regex:"教程"}})
$options
操做符;db.article.find({title:{$regex:"elasticsearch",$options:"$i"}})
具體參考:《mall整合Mongodb實現文檔操做》正則表達式
mall項目全套學習教程連載中,關注公衆號第一時間獲取。redis