MogoDb快速入門

一,簡(jiǎn)介
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由C++語(yǔ)言編寫,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB是一個(gè)介于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系型數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系型數(shù)據(jù)庫(kù)的。

二,安裝
windows下安裝

運(yùn)行MongoDB安裝包并選擇自定義安裝,設(shè)置好安裝路徑;


image.png

配置MongoDB,讓MongoDB作為服務(wù)運(yùn)行,并配置好數(shù)據(jù)目錄和日志目錄;


image.png

取消MongoDB Compass的安裝選項(xiàng)(不取消安裝極慢),需要可自行安裝;


image.png

雙擊mongo.exe可以運(yùn)行MongoDB自帶客戶端,操作MongoDB;


image.png

連接成功后會(huì)顯示如下信息;


image.png

如果需要移除MongoDB服務(wù),只需使用管理員權(quán)限運(yùn)行cmd工具,并輸入如下命令。
sc.exe delete MongoDB

Linux下的安裝
下載MongoDB的Docker鏡像;
docker pull mongo:4.2.5

使用Docker命令啟動(dòng)MongoDB服務(wù);
docker run -p 27017:27017 --name mongo
-v /mydata/mongo/db:/data/db
-d mongo:4.2.5

有時(shí)候我們需要為MongoDB設(shè)置賬號(hào),可以使用如下命令啟動(dòng);
docker run -p 27017:27017 --name mongo
-v /mydata/mongo/db:/data/db
-d mongo:4.2.5 --auth

然后我們需要進(jìn)入容器中的MongoDB客戶端;
docker exec -it mongo mongo

之后在admin集合中創(chuàng)建一個(gè)賬號(hào)用于連接,這里創(chuàng)建的是基于root角色的超級(jí)管理員帳號(hào);
use admin
db.createUser({
user: 'mongoadmin',
pwd: 'secret',
roles: [ { role: "root", db: "admin" } ] });

創(chuàng)建完成后驗(yàn)證是否可以登錄;
db.auth("mongoadmin","secret")

整個(gè)賬號(hào)創(chuàng)建過(guò)程可以參考下圖。


image.png

三,客戶端工具
MongoDB的客戶端工具有很多,上面沒安裝的MongoDB Compass就是其中之一,另外Navicat 15版本也有MongoDB的管理功能。這里我們使用的是一款免費(fèi)的客戶端工具Robo 3T(以前叫Robomongo)。

下載完成后解壓,雙擊robo3t.exe即可使用;


image.png

之后創(chuàng)建一個(gè)到MongoDB的連接;


image.png

創(chuàng)建連接成功以后,就可以操作MongoDB了。


image.png

四,相關(guān)概念
MongoDB是非關(guān)系型數(shù)據(jù)庫(kù)當(dāng)中最像關(guān)系型數(shù)據(jù)庫(kù)的,所以我們通過(guò)它與關(guān)系型數(shù)據(jù)庫(kù)的對(duì)比,來(lái)了解下它的概念。


image.png

五,數(shù)據(jù)庫(kù)操作
創(chuàng)建數(shù)據(jù)庫(kù),使用use命令去創(chuàng)建數(shù)據(jù)庫(kù),當(dāng)插入第一條數(shù)據(jù)時(shí)會(huì)創(chuàng)建數(shù)據(jù)庫(kù),例如創(chuàng)建一個(gè)test數(shù)據(jù)庫(kù);

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

刪除數(shù)據(jù)庫(kù),使用db對(duì)象中的dropDatabase()方法來(lái)刪除;

db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

六,集合操作
創(chuàng)建集合,使用db對(duì)象中的createCollection()方法來(lái)創(chuàng)建集合,例如創(chuàng)建一個(gè)article集合;

use test
switched to db test
db.createCollection("article")
{ "ok" : 1 }
show collections
article

刪除集合,使用collection對(duì)象的drop()方法來(lái)刪除集合,例如刪除一個(gè)article集合;

db.article.drop()
true
show collections

七,文檔操作
上面的數(shù)據(jù)庫(kù)和集合操作是在MongoDB的客戶端中進(jìn)行的,下面的文檔操作都是在Robomongo中進(jìn)行的。

插入文檔
MongoDB通過(guò)collection對(duì)象的insert()方法向集合中插入文檔,語(yǔ)法如下;
db.collection.insert(document)

使用collection對(duì)象的insert()方法來(lái)插入文檔,例如插入一個(gè)article文檔;
db.article.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
by: 'Andy',
url: 'https://www.mongodb.com/',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})

使用collection對(duì)象的find()方法可以獲取文檔,例如獲取所有的article文檔;
db.article.find({})
{
"_id" : ObjectId("5e9943661379a112845e4056"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "Andy",
"url" : "https://www.mongodb.com/",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100.0
}

更新文檔
MongoDB通過(guò)collection對(duì)象的update()來(lái)更新集合中的文檔,語(yǔ)法如下;
db.collection.update(
<query>,
<update>,
{
multi: <boolean>
}
)

query:修改的查詢條件,類似于SQL中的WHERE部分

update:更新屬性的操作符,類似與SQL中的SET部分

multi:設(shè)置為true時(shí)會(huì)更新所有符合條件的文檔,默認(rèn)為false只更新找到的第一條

將title為MongoDB 教程的所有文檔的title修改為MongoDB;
db.article.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

除了update()方法以外,save()方法可以用來(lái)替換已有文檔,語(yǔ)法如下;
db.collection.save(document)
這次我們將ObjectId為5e9943661379a112845e4056的文檔的title改為MongoDB 教程;

db.article.save({//不推薦,更新時(shí)必須寫所有的字段,如果字段不全,則不全的字段會(huì)丟失
"_id" : ObjectId("5e9943661379a112845e4056"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "Andy",
"url" : "https://www.mongodb.com/",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100.0
})

刪除文檔
MongoDB通過(guò)collection對(duì)象的remove()方法來(lái)刪除集合中的文檔,語(yǔ)法如下;
db.collection.remove(
<query>,
{
justOne: <boolean>
}
)

query:刪除的查詢條件,類似于SQL中的WHERE部分

justOne:設(shè)置為true只刪除一條記錄,默認(rèn)為false刪除所有記錄

刪除title為MongoDB 教程的所有文檔;
db.article.remove({'title':'MongoDB 教程'})

查詢文檔
MongoDB通過(guò)collection對(duì)象的find()方法來(lái)查詢文檔,語(yǔ)法如下;
db.collection.find(query, projection)

query:查詢條件,類似于SQL中的WHERE部分

projection:可選,使用投影操作符指定返回的鍵

查詢article集合中的所有文檔;
db.article.find()
/* 1 */
{
"_id" : ObjectId("5e994dcb1379a112845e4057"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
"by" : "Andy",
"url" : "https://www.mongodb.com/",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 50.0
}

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

/* 3 */
{
"_id" : ObjectId("5e994e111379a112845e4059"),
"title" : "Redis 教程",
"description" : "Redis 是一個(gè)key-value數(shù)據(jù)庫(kù)",
"by" : "Andy",
"url" : "https://redis.io/",
"tags" : [
"redis",
"database",
"NoSQL"
],
"likes" : 150.0
}

MongoDB中的條件操作符,通過(guò)與SQL語(yǔ)句的對(duì)比來(lái)了解下;


image.png

條件查詢,查詢title為MongoDB 教程的所有文檔;
db.article.find({'title':'MongoDB 教程'})

條件查詢,查詢likes大于50的所有文檔;
db.article.find({'likes':{$gt:50}})

AND條件可以通過(guò)在find()方法傳入多個(gè)鍵,以逗號(hào)隔開來(lái)實(shí)現(xiàn),例如查詢title為MongoDB 教程并且by為Andy的所有文檔;
db.article.find({'title':'MongoDB 教程','by':'Andy'})

OR條件可以通過(guò)使用or操作符實(shí)現(xiàn),例如查詢title為Redis 教程或MongoDB 教程的所有文檔; db.article.find({or:[{"title":"Redis 教程"},{"title": "MongoDB 教程"}]})

AND 和 OR條件的聯(lián)合使用,例如查詢likes大于50,并且title為Redis 教程或者"MongoDB 教程的所有文檔。
db.article.find({"likes": {gt:50},or: [{"title": "Redis 教程"},{"title": "MongoDB 教程"}]})

八,其他操作
Limit與Skip操作
讀取指定數(shù)量的文檔,可以使用limit()方法,語(yǔ)法如下;
db.collection.find().limit(NUMBER)

只查詢article集合中的2條數(shù)據(jù);
db.article.find().limit(2)

跳過(guò)指定數(shù)量的文檔來(lái)讀取,可以使用skip()方法,語(yǔ)法如下;
db.collection.find().limit(NUMBER).skip(NUMBER)

從第二條開始,查詢article集合中的2條數(shù)據(jù);
db.article.find().limit(2).skip(1)

排序
在MongoDB中使用sort()方法對(duì)數(shù)據(jù)進(jìn)行排序,sort()方法通過(guò)參數(shù)來(lái)指定排序的字段,并使用1和-1來(lái)指定排序方式,1為升序,-1為降序;
db.collection.find().sort({KEY:1})

按article集合中文檔的likes字段降序排列;
db.article.find().sort({likes:-1})

索引
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。

MongoDB使用createIndex()方法來(lái)創(chuàng)建索引,語(yǔ)法如下;
db.collection.createIndex(keys, options)

background:建索引過(guò)程會(huì)阻塞其它數(shù)據(jù)庫(kù)操作,設(shè)置為true表示后臺(tái)創(chuàng)建,默認(rèn)為false

unique:設(shè)置為true表示創(chuàng)建唯一索引

name:指定索引名稱,如果沒有指定會(huì)自動(dòng)生成

給title和description字段創(chuàng)建索引,1表示升序索引,-1表示降序索引,指定以后臺(tái)方式創(chuàng)建;
db.article.createIndex({"title":1,"description":-1}, {background: true})

查看article集合中已經(jīng)創(chuàng)建的索引;
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語(yǔ)句,語(yǔ)法如下;
db.collection.aggregate(AGGREGATE_OPERATION)
聚合中常用操作符如下;


image.png

根據(jù)by字段聚合文檔并計(jì)算文檔數(shù)量,類似與SQL中的count()函數(shù);
db.article.aggregate([{group : {_id : "by", sum_count : {$sum : 1}}}])
/* 1 */
{
"_id" : "Andy",
"sum_count" : 2.0
}

/* 2 */
{
"_id" : "Ruby",
"sum_count" : 1.0
}

根據(jù)by字段聚合文檔并計(jì)算likes字段的平局值,類似與SQL中的avg()語(yǔ)句;
db.article.aggregate([{group : {_id : "by", avg_likes : {avg : "likes"}}}])
/* 1 */
{
"_id" : "Andy",
"avg_likes" : 100.0
}

/* 2 */
{
"_id" : "Ruby",
"avg_likes" : 100.0
}

正則表達(dá)式
MongoDB使用$regex操作符來(lái)設(shè)置匹配字符串的正則表達(dá)式,可以用來(lái)模糊查詢,類似于SQL中的like操作;

例如查詢title中包含教程的文檔;
db.article.find({title:{$regex:"教程"}})

不區(qū)分大小寫的模糊查詢,使用options操作符; db.article.find({title:{regex:"elasticsearch",options:"i"}})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容