零、本文綱要
一、MongoDB相關(guān)概念
- 應(yīng)用場(chǎng)景
- 體系結(jié)構(gòu)
- 數(shù)據(jù)模型
二、使用MongoDB
- 安裝MongoDB
- 常用命令
① 數(shù)據(jù)庫(kù)操作
② 集合操作(對(duì)應(yīng)數(shù)據(jù)庫(kù)表操作)
③ 文檔操作(相當(dāng)于數(shù)據(jù)庫(kù)CRUD)
Ⅰ 插入數(shù)據(jù)
Ⅱ 查詢操作
Ⅲ 更新操作
Ⅳ 刪除操作
④ 文檔操作(其他常用查詢)
Ⅰ 統(tǒng)計(jì)操作
Ⅱ 分頁(yè)操作
Ⅲ 排序操作
Ⅳ 模糊查詢(正則查詢)
Ⅴ 比較查詢
Ⅵ 包含查詢
Ⅶ 條件連接查詢
⑤ 操作小結(jié)
一萤晴、MongoDB相關(guān)概念
1. 應(yīng)用場(chǎng)景
① 數(shù)據(jù)量大;
② 寫(xiě)入操作頻繁(讀寫(xiě)都很頻繁)胁后;
③ 價(jià)值較低的數(shù)據(jù)店读,對(duì)事務(wù)性要求不高;
2. 體系結(jié)構(gòu)
SQL術(shù)語(yǔ)/概念 | MongoDB術(shù)語(yǔ)/概念 | 解釋說(shuō)明 |
---|---|---|
database | database | 數(shù)據(jù)庫(kù) |
table | collection | 數(shù)據(jù)庫(kù)表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | / | 表連接攀芯,MongoDB不支持 |
/ | 嵌入文檔 | MongoDB通過(guò)嵌入式文檔來(lái)替代多表連接 |
primary key | primary key | 主鍵屯断,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
3. 數(shù)據(jù)模型
MongoDB的最小存儲(chǔ)單位就是文檔(document)對(duì)象。文檔(document)對(duì)象對(duì)應(yīng)于關(guān)系型數(shù)據(jù)庫(kù)的行侣诺。
數(shù)據(jù)在MongoDB中以BSON(Binary-JSON)文檔的格式存儲(chǔ)在磁盤(pán)上殖演。
Bson中,除了基本的JSON類(lèi)型:string,integer,boolean,double,null,array和object年鸳;
mongo還使用了特殊的數(shù)據(jù)類(lèi)型趴久,包括:date,object id,binary data,regular expression 和code。
常見(jiàn)數(shù)據(jù)類(lèi)型
數(shù)據(jù)類(lèi)型 | 描述 | 舉例 |
---|---|---|
String | 字符串搔确。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類(lèi)型彼棍。在 MongoDB 中灭忠,UTF-8 編碼的字符串才是合法的。 | {"x" : "foobar"} |
Integer | 整型數(shù)值滥酥。用于存儲(chǔ)數(shù)值更舞。根據(jù)你所采用的服務(wù)器,可分為 32 位或 64 位坎吻。 | shell是不支持該類(lèi)型的缆蝉, shell中默認(rèn)會(huì)轉(zhuǎn)換成64位浮點(diǎn)數(shù) |
Boolean | 布爾值。用于存儲(chǔ)布爾值(真/假)瘦真。 | {"x":true}+ |
Double | 雙精度浮點(diǎn)值刊头。用于存儲(chǔ)浮點(diǎn)值。 | {"x":3.14159诸尽,"y":3} |
Min/Max keys | 將一個(gè)值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對(duì)比原杂。 | |
Array | 用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵。 | {"x" : ["a", "b", "c"]} |
Timestamp | 時(shí)間戳您机。記錄文檔修改或添加的具體時(shí)間穿肄。 | |
Object | 用于內(nèi)嵌文檔。 | |
Null | 用于創(chuàng)建空值际看。 | {"x":null} |
Symbol | 符號(hào)咸产。該數(shù)據(jù)類(lèi)型基本上等同于字符串類(lèi)型,但不同的是仲闽,它一般用于采用特殊符號(hào)類(lèi)型的語(yǔ)言脑溢。 | |
Date | 日期時(shí)間。用 UNIX 時(shí)間格式來(lái)存儲(chǔ)當(dāng)前日期或時(shí)間赖欣。你可以指定自己的日期時(shí)間:創(chuàng)建 Date 對(duì)象屑彻,傳入年月日信息。 | |
Object ID | 對(duì)象 ID顶吮。用于創(chuàng)建文檔的 ID社牲。 | {"X" :ObjectId() } |
Binary Data | 二進(jìn)制數(shù)據(jù)。用于存儲(chǔ)二進(jìn)制數(shù)據(jù)云矫。 | |
Code | 代碼類(lèi)型膳沽。用于在文檔中存儲(chǔ) JavaScript 代碼。 | {"x" : function() { /* …… */ }} |
Regular expression | 正則表達(dá)式類(lèi)型让禀。用于存儲(chǔ)正則表達(dá)式挑社。 | {"x" : /foobar/i} |
二、使用MongoDB
1. 安裝MongoDB
① 解壓至指定目錄
tar -zxvf mongodb-linux-x86_64-4.0.10.tgz -C /usr/local
② 準(zhǔn)備數(shù)據(jù)目錄
cd mongodb-linux-x86_64-4.0.10/
mkdir -p single/data/db
mkdir -p single/log
③ 編寫(xiě)配置文件
touch single/mongodb.conf
systemLog:
#MongoDB發(fā)送所有日志輸出的目標(biāo)指定為文件
# #The path of the log file to which mongod or mongos should send all diagnostic logging information
destination: file
#mongod或mongos應(yīng)向其發(fā)送所有診斷日志記錄信息的日志文件的路徑
path: "/usr/local/mongodb-linux-x86_64-4.0.10/single/log/mongod.log"
#當(dāng)mongos或mongod實(shí)例重新啟動(dòng)時(shí)巡揍,mongos或mongod會(huì)將新條目附加到現(xiàn)有日志文件的末尾痛阻。
logAppend: true
storage:
#mongod實(shí)例存儲(chǔ)其數(shù)據(jù)的目錄。storage.dbPath設(shè)置僅適用于mongod腮敌。
##The directory where the mongod instance stores its data.Default Value is "/data/db".
dbPath: "/usr/local/mongodb-linux-x86_64-4.0.10/single/data/db"
journal:
#啟用或禁用持久性日志以確保數(shù)據(jù)文件保持有效和可恢復(fù)阱当。
enabled: true
processManagement:
#啟用在后臺(tái)運(yùn)行mongos或mongod進(jìn)程的守護(hù)進(jìn)程模式俏扩。
fork: true
net:
#服務(wù)實(shí)例綁定的IP,默認(rèn)是localhost
bindIp: localhost,192.168.253.128
#bindIp
#綁定的端口弊添,默認(rèn)是27017
port: 27017
④ 啟動(dòng)MongoDB服務(wù)
bin/mongod -f single/mongodb.conf
查看進(jìn)程啟動(dòng)情況:ps -ef | grep mongod
⑤ 關(guān)閉MongoDB服務(wù)
標(biāo)準(zhǔn)的關(guān)閉方法需要連接至其客戶端進(jìn)行關(guān)閉录淡,如下:
bin/mongo --port 27017
use admin
db.shutdownServer()
如果遇到數(shù)據(jù)損壞:
rm -f single/data/db/*.lock
bin/mongod --repair --dbpath=single/data/db
2. 常用命令
MongoDB官方文檔,這個(gè)網(wǎng)址不穩(wěn)定油坝,需要飛機(jī)嫉戚。
首先登錄其client端bin/mongo --port 27017
,此處也可以使用其他數(shù)據(jù)庫(kù)客戶端直接連接澈圈,如:DataGrip彬檀。
① 數(shù)據(jù)庫(kù)操作
# 創(chuàng)建數(shù)據(jù)庫(kù)
use [database_name]
#如:
use db_test
# 查看當(dāng)前權(quán)限的所有數(shù)據(jù)庫(kù)
show databases
show dbs
# 查看當(dāng)前正在使用的數(shù)據(jù)庫(kù)
db
# 刪除數(shù)據(jù)庫(kù),刪除當(dāng)前數(shù)據(jù)庫(kù)
db.dropDatabase()
② 集合操作(對(duì)應(yīng)數(shù)據(jù)庫(kù)表操作)
# 顯示創(chuàng)建(了解)
db.createCollection(["collection_name"])
#如:
db.createCollection("collection_test")
#查看當(dāng)前庫(kù)中的集合(對(duì)應(yīng)數(shù)據(jù)庫(kù)的表)
show collections
show tables
# 刪除集合
db.collection.drop()
db.[collection_name].drop()
#如:
db.collection_test.drop()
③ 文檔操作(相當(dāng)于數(shù)據(jù)庫(kù)CRUD)
Ⅰ 插入數(shù)據(jù)
注意:此處插入的數(shù)據(jù)后續(xù)會(huì)持續(xù)用到瞬女,如果后續(xù)數(shù)據(jù)不足可以重新插入幾個(gè)窍帝。
# 單個(gè)文檔插入
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
#如:
db.collection_test.insertOne(
{
"articleid":"100000",
"content":"今天天氣真好,陽(yáng)光明媚",
"userid":"1001",
"nickname":"Rose",
"createdatetime":new Date(),
"likenum":NumberInt(10),
"state":null
}
)
# 批量插入
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
#如:
db.collection_test.insertMany([
{
"_id":"1",
"articleid":"100001",
"content":"我們不應(yīng)該把清晨浪費(fèi)在手機(jī)上诽偷,健康很重要坤学,一杯溫水幸福你我他。",
"userid":"1002",
"nickname":"相忘于江湖",
"createdatetime":new Date("2019-08-05T22:08:15.522Z"),
"likenum":NumberInt(1000),
"state":"1"
},
{
"_id":"2",
"articleid":"100001",
"content":"我夏天空腹喝涼開(kāi)水报慕,冬天喝溫開(kāi)水",
"userid":"1005",
"nickname":"伊人憔悴",
"createdatetime":new Date("2019-08-05T23:58:51.485Z"),
"likenum":NumberInt(888),
"state":"1"
}
]);
參數(shù)說(shuō)明:
document:要寫(xiě)入的文檔拥峦;
writeConcern:寫(xiě)入策略,默認(rèn)為 1卖子,即要求確認(rèn)寫(xiě)操作,0 是不要求刑峡;
ordered:指定是否按順序?qū)懭胙竺觯J(rèn) true,按順序?qū)懭搿?br> 一般我們都只寫(xiě)<document>突梦,writeConcern 與 ordered 使用默認(rèn)值即可诫舅。
Ⅱ 查詢操作
# 查詢所有
db.[collection_name].find()
db.[collection_name].find({})
#如:
db.collection_test.find();
# 條件查詢
db.[collection_name].find(
{
[field_name]: [field_value]
}
)
#如:
db.collection_test.find({articleid: "100000"})
db.collection_test.find({articleid: "100001", likenum: 888})
# 投影查詢:指定顯示與不顯示的字段
db.[collection_name].find(
{
[field_name]: [field_value]
},
{
[field_name]: 1, #顯示
[field_name]: 0 #不顯示
}
)
#如:
db.collection_test.find(
{articleid: "100001", likenum: 888},
{_id: 0, articleid: 1, likenum: 1}
)
Ⅲ 更新操作
# 單個(gè)更新操作
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
#如:
db.collection_test.updateOne(
{articleid: "100000"},
{$set:{likenum:NumberInt(99)}}
)
# 批量更新
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
#如:
db.collection_test.updateMany(
{articleid: "100001"},
{$set:{likenum:NumberInt(99)}}
)
# 列值增長(zhǎng) $inc
db.collection_test.updateMany(
{_id: "2"},
{$inc:{likenum:NumberInt(1)}}
)
參數(shù)說(shuō)明:
filter : update的查詢條件,類(lèi)似sql update查詢內(nèi)where后面的宫患;
update : update的對(duì)象和一些更新的操作符(如inc...)等刊懈,也可以理解為sql update查詢內(nèi)set后面的;
upsert : 可選娃闲,這個(gè)參數(shù)的意思是虚汛,如果不存在update的記錄,是否插入objNew皇帮,true為插入卷哩,默認(rèn)是false,不插入属拾;
writeConcern:可選将谊,拋出異常的級(jí)別冷溶;
collation : 可選,指定 用于操作的排序規(guī)則尊浓;
arrayFilters :可選逞频,篩選器文檔數(shù)組,用于確定要對(duì)數(shù)組字段進(jìn)行更新操作要修改的數(shù)組元素栋齿;
hint:可選苗胀,指定用于支持查詢謂詞的索引的文檔或字符串,4.2.1版本開(kāi)始可用褒颈。
一般我們也不通過(guò)語(yǔ)句直接使用這些參數(shù)柒巫。
Ⅳ 刪除操作
# 刪除單個(gè)
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
#如:
db.collection_test.deleteOne(
{likenum: NumberInt(100)}
)
# 刪除多個(gè)
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
#如:
db.collection_test.deleteMany(
{likenum: NumberInt(99)}
)
# 刪表跑路
db.collection_test.deleteMany({})
④ 文檔操作(其他常用查詢)
Ⅰ 統(tǒng)計(jì)操作
與4.0功能兼容的MongoDB驅(qū)動(dòng)程序棄用各自的光標(biāo)和收集count()的API,取而代之的是新的API countDocuments()和estimatedDocumentCount()谷丸。
此處堡掏,count()的功能我們會(huì)通過(guò)新的API實(shí)現(xiàn)。
# 統(tǒng)計(jì)操作(類(lèi)似數(shù)據(jù)庫(kù)聚合查詢)
db.collection.countDocuments( <query>, <options> )
#如:
db.collection_test.countDocuments({}) #統(tǒng)計(jì)文檔記錄數(shù)
db.collection_test.countDocuments( #統(tǒng)計(jì)likenum為888的記錄數(shù)
{likenum: NumberInt(888)}
)
# 不含過(guò)濾規(guī)則的統(tǒng)計(jì)
db.collection.estimatedDocumentCount( <options> )
#如:
db.collection_test.estimatedDocumentCount({})
options參數(shù)說(shuō)明
limit 整數(shù) 可選 要計(jì)算的最大文件數(shù)刨疼。
skip 整數(shù) 可選 計(jì)數(shù)前要跳過(guò)的文檔數(shù)泉唁。
hint 字符串或文件 可選 用于查詢的索引名稱(chēng)或索引規(guī)范。
maxTimeMS 整數(shù) 可選的 允許計(jì)數(shù)運(yùn)行的最長(zhǎng)時(shí)間揩慕。
避免使用db.collection.count()
沒(méi)有查詢謂詞的方法亭畜,因?yàn)槿绻麤](méi)有查詢謂詞,該方法將基于集合的元數(shù)據(jù)返回結(jié)果迎卤,這可能會(huì)導(dǎo)致近似計(jì)數(shù)拴鸵。
特別是:
a、在分片群集上蜗搔,結(jié)果計(jì)數(shù)將無(wú)法正確過(guò)濾出孤立的文檔劲藐;
b、不正常關(guān)機(jī)后樟凄,計(jì)數(shù)可能不正確聘芜。
Ⅱ 分頁(yè)操作
# 分頁(yè)查詢
db.collection.find().limit(NUMBER).skip(NUMBER)
#如:
db.collection_test.find().limit(2).skip(2)
Ⅲ 排序操作
# 排序操作
db.collection.find().sort(
{
field_name: 1, #1表示升序
field_name: -1 #-1表示降序
}
)
#如:
db.collection_test.find().sort(
{
state: 1,
likenum: -1
}
)
Ⅳ 模糊查詢(正則查詢)
# 正則查詢
db.collection.find({field_name:/正則表達(dá)式/})
#如:
db.collection_test.find(
{nickname: /江湖/}
)
Ⅴ 比較查詢
# 比較查詢
db.collection.find({ field_name : { $gt: value }}) // 大于: field > value
db.collection.find({ field_name : { $lt: value }}) // 小于: field < value
db.collection.find({ field_name : { $gte: value }}) // 大于等于: field >= value
db.collection.find({ field_name : { $lte: value }}) // 小于等于: field <= value
db.collection.find({ field_name : { $ne: value }}) // 不等于: field != value
#如:
db.collection_test.find(
{likenum: {$gt: NumberInt(999)}}
)
Ⅵ 包含查詢
# 包含查詢
db.collection.find({ field_name : { $in:[ value1, value2]}})
db.collection.find({ field_name : { $nin:[ value1, value2]}})
#如:
db.collection_test.find(
{likenum: {$in: [NumberInt(888), NumberInt(1000)]}}
)
Ⅶ 條件連接查詢
# and連接
db.collection.find({ $and:[{}, {}] })
#如:
db.collection_test.find({
$and: [
{likenum: {$gte: NumberInt(900)}},
{likenum: {$lte: NumberInt(1000)}}
]
})
# or連接
db.collection.find({ $or:[{}, {}] })
#如:
db.collection_test.find({
$or: [
{likenum: {$lte: NumberInt(900)}},
{likenum: {$gte: NumberInt(950)}}
]
})
⑤ 操作小結(jié)
1. 選擇切換數(shù)據(jù)庫(kù):use collection
2. 插入數(shù)據(jù):db.collection.insert({bson數(shù)據(jù)})
3. 查詢所有數(shù)據(jù):db.collection.find()
4. 條件查詢數(shù)據(jù):db.collection.find({條件})
5. 查詢符合條件的第一條記錄:db.collection.findOne({條件})
6. 查詢符合條件的前幾條記錄:db.collection.find({條件}).limit(條數(shù))
7. 查詢符合條件的跳過(guò)的記錄:db.collection.find({條件}).skip(條數(shù))
8. 修改數(shù)據(jù):db.collection.updateOne({條件},{修改后的數(shù)據(jù)})
或 db.collection.updateOne({條件},{$set:{要修改部分的字段:數(shù)據(jù)})
或 db.collection.updateMany({條件},{修改后的數(shù)據(jù)})
9. 修改數(shù)據(jù)并自增某字段值:db.collection.updateOne({條件},{$inc:{自增的字段:步進(jìn)值}})
10. 刪除數(shù)據(jù):db.collection.deleteOne({條件})
或 db.collection.deleteMany({條件})
11. 統(tǒng)計(jì)查詢:db.collection.count({條件})
或 db.collection.countDocuments({條件})
或 db.collection.estimatedDocumentCount()
12. 模糊查詢:db.collection.find({字段名:/正則表達(dá)式/})
13. 條件比較運(yùn)算:db.collection.find({字段名:{$gt:值}})
14. 包含查詢:db.collection.find({字段名:{$in:[值1,值2]}})
或 db.collection.find({字段名:{$nin:[值1缝龄,值2]}})
15. 條件連接查詢:db.collection.find({$and:[{條件1},{條件2}]})
或 db.collection.find({$or:[{條件1},{條件2}]})
三汰现、結(jié)尾
以上即為MongoDB-基礎(chǔ)使用(一)的全部?jī)?nèi)容,感謝閱讀叔壤。