培訓(xùn)機(jī)構(gòu)招生方案win優(yōu)化大師有用嗎
MongoDB 基礎(chǔ)
mongoDB 是由 C++語言編寫,基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng),是一個(gè) nosql 數(shù)據(jù)庫.
在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),保證服務(wù)器性能,MongoDB 旨在為 web 引用提供可擴(kuò)展的高性能存儲(chǔ)解決方案,將數(shù)據(jù)存儲(chǔ)為給文檔,
數(shù)據(jù)結(jié)構(gòu)由鍵值(key,value)對(duì)組成,MongoDB 文檔類似于 json 對(duì)象,字段值可以包含其他文檔,數(shù)據(jù)以及文檔數(shù)組.
主要特點(diǎn)
面向文檔:MongoDB 存儲(chǔ)的數(shù)據(jù)采用 JSON 樣式的 BSON(二進(jìn)制 JSON)文檔格式,可以直接映射到應(yīng)用程序的對(duì)象模型。這種面向文檔的模型使得數(shù)據(jù)的存儲(chǔ)和查詢更加靈活和方便。
高性能:MongoDB 具有高度并行化和低延遲的讀寫操作,支持水平擴(kuò)展以處理大量數(shù)據(jù)。它還支持基于內(nèi)存的操作,可以提供非常快的查詢速度。
良好的可擴(kuò)展性:MongoDB 的架構(gòu)設(shè)計(jì)適合橫向擴(kuò)展,它可以通過添加更多的節(jié)點(diǎn)來處理更大規(guī)模的數(shù)據(jù)和負(fù)載。同時(shí),它支持自動(dòng)分片,可以將數(shù)據(jù)分布在多個(gè)服務(wù)器上進(jìn)行負(fù)載均衡。
強(qiáng)大的查詢功能:MongoDB 提供了豐富的查詢功能,包括范圍查詢、全文搜索、正則表達(dá)式等,并支持聚合查詢和地理空間查詢。此外,它還支持二級(jí)索引,可以根據(jù)需求對(duì)不同字段建立索引。
靈活的數(shù)據(jù)模型:MongoDB 的文檔模型允許存儲(chǔ)具有不同結(jié)構(gòu)和字段的文檔,無需事先定義表結(jié)構(gòu)。這種靈活性使得應(yīng)用程序可以隨時(shí)更改和擴(kuò)展數(shù)據(jù)模型,而無需任何遷移過程。
多種數(shù)據(jù)一致性選項(xiàng):MongoDB 提供了多種數(shù)據(jù)一致性選項(xiàng),可以在數(shù)據(jù)的一致性和性能之間進(jìn)行權(quán)衡。開發(fā)人員可以根據(jù)需求選擇合適的副本集或分片策略,以滿足應(yīng)用程序的需求。
社區(qū)支持和生態(tài)系統(tǒng):MongoDB 有一個(gè)龐大的用戶社區(qū)和活躍的開發(fā)者社區(qū),提供了豐富的資源和支持。此外,MongoDB 還有許多附加工具和第三方庫,可以幫助用戶更好地使用和管理數(shù)據(jù)庫。
- 1,MongoDB 是一個(gè)面向文檔存儲(chǔ)的數(shù)據(jù)庫,操作簡單
- 2,你可以在 MongoDB 記錄設(shè)置任何屬性的索引
- 3,可以通過本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,
- 4,支持網(wǎng)絡(luò)分片
- 5,豐富的查詢表達(dá)式,查詢指令使用 json 形式,可以在文檔中內(nèi)嵌對(duì)象和數(shù)組
- 6,使用 update 命令可以實(shí)現(xiàn)替換完成文檔數(shù)據(jù)或者一些指定字段的更新,
- 7,map/reduce 主要是用來對(duì)統(tǒng)計(jì)數(shù)據(jù)進(jìn)行批量出和操作,
- 8,map 函數(shù)調(diào)用的 emit(key,value)遍歷集合中所有記錄,將 key 于 value 傳給 Reduce 函數(shù)進(jìn)行處理,
- map 函數(shù)和 reduce 函數(shù)使用 js 編寫的,并可以通過 db.runCommand 或 mapreduce 命令來執(zhí)行 MapReduce 操作。
- GridFS 是 MongoDB 中的一個(gè)內(nèi)置功能,可以用于存放大量小文件,
- mongoDB 允許在服務(wù)器端執(zhí)行腳本,可以用 js 編寫某個(gè)函數(shù),直接在服務(wù)器端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端下,下次直接調(diào)用了,
- MongoDB 支持多種變成語言,Python,c++,php,c#等多種,
mongoDB 概念解析
將于關(guān)系數(shù)據(jù)庫類比解析
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-S5Ulzncu-1690278972184)(./images/2022-10-20-16-48-43.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-4j5Stjt6-1690278972185)(./images/2022-10-20-16-49-01.png)]
這里就可以很多看出,這里是以 json 字符串方式的匹配.
數(shù)據(jù)庫
MongoDB 的單個(gè)實(shí)例可以容納多個(gè)獨(dú)立的數(shù)據(jù)庫,每各都有自己的集合和權(quán)限,不同的數(shù)據(jù)庫也放置在不同的文件中,
show dbs : 可以顯示所有數(shù)據(jù)的列表,
db: 可以顯示當(dāng)前數(shù)據(jù)庫對(duì)象或集合
use: 指定一個(gè)連接到一個(gè)數(shù)據(jù)庫
有一些數(shù)據(jù)庫名是保留的,可以直接訪問這些有特殊作用的數(shù)據(jù)庫。
admin: 從權(quán)限的角度來看,這是"root"數(shù)據(jù)庫。要是將一個(gè)用戶添加到這個(gè)數(shù)據(jù)庫,這個(gè)用戶自動(dòng)繼承所有數(shù)據(jù)庫的權(quán)限。一些特定的服務(wù)器端命令也只能從這個(gè)數(shù)據(jù)庫運(yùn)行,比如列出所有的數(shù)據(jù)庫或者關(guān)閉服務(wù)器。
local: 這個(gè)數(shù)據(jù)永遠(yuǎn)不會(huì)被復(fù)制,可以用來存儲(chǔ)限于本地單臺(tái)服務(wù)器的任意集合
config: 當(dāng) Mongo 用于分片設(shè)置時(shí),config 數(shù)據(jù)庫在內(nèi)部使用,用于保存分片的相關(guān)信息。
文檔(Document)
文檔是一組鍵值對(duì),文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型,這與關(guān)系型數(shù)據(jù)庫有很大的區(qū)別,
例如:
{ "site": "www.runoob.com", "name": "菜鳥教程" }
需要注意的是:
1,文檔中的鍵值是有序的,
2,文檔中的值不僅可以是在雙引號(hào)里面的字符串,還可以是其他幾種數(shù)據(jù)類型
3,mongoDB 區(qū)分類型和大小寫
4,文檔中不能有重復(fù)的鍵
5,文檔中的鍵是字符串,使用 utf-8
文檔鍵命令要求:
鍵不能有空字符,一般是來識(shí)別鍵結(jié)尾,
.和$有特殊意義,只有在特定環(huán)境下使用
以下劃線_開頭的鍵是保留的(不嚴(yán)格要求)
注意: 在 MongoDB 中,因?yàn)樗旧砭哂械撵`活性,所以不要求一個(gè)集合中的文檔的字段格式必須要相同,這于關(guān)系型數(shù)據(jù)很不大同。
其中單個(gè)文檔具有不同字段,那么也就是具有了不同的數(shù)據(jù)長度,例如:
{ _id: 1, name: "John", age: 20, grade: "A" }
{ _id: 2, name: "Jane", age: 22, major: "Computer Science", GPA: 3.5 }
需要注意的是: 查詢操作的時(shí)候,對(duì)于缺少該字段的文檔,不會(huì)返回控制,而是直接忽略,在結(jié)果中不會(huì)展示。
集合
集合就是 MongoDB 文檔組,類似于關(guān)系型數(shù)據(jù)庫中的表
集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu),這意味著對(duì)集合可以插入不同格式和類型的數(shù)據(jù),當(dāng)?shù)谝粋€(gè)文檔被插入的時(shí)候,集合就已經(jīng)被創(chuàng)建了.
集合命令不能以"system"開頭,這是為了系統(tǒng)集合保留前綴.
用戶創(chuàng)建的集合名字不能含有保留字符。有些驅(qū)動(dòng)程序的確支持在集合名里面包含,這是因?yàn)槟承┫到y(tǒng)生成的集合中包含該字符。除非你要訪問這種系統(tǒng)創(chuàng)建的集合,否則千萬不要在名字里出現(xiàn)$。
集合名不能是空字符串""。
集合名不能含有\(zhòng)0 字符(空字符),這個(gè)字符表示集合名的結(jié)尾。
capped collections
capped collections 就是固定大小的集合,它有很高的性能以及隊(duì)列過期的特性,
capped collections 是高性能自動(dòng)維護(hù)對(duì)象的插入順序,它非常適合類似記錄日志的功能和標(biāo)準(zhǔn)的 collection 不同,你必須要顯示的創(chuàng)建一個(gè) capped collections,指定它的大小,單位是字節(jié),是可以提前分配的,
capped collections 可以按照文檔的插入順序保存到集合中,而且這些文檔在磁盤上存放的位置,也是按照順序來保存的,所以當(dāng)我們更新 capped collections 中文檔的時(shí)候,更新后的文檔的不能超過之前文檔的大小,這樣就可以保持所有文檔在磁盤上的位置一直保持不變.
可以很好的提高插入數(shù)據(jù)額效率,要注意的是:指定的存儲(chǔ)大小包含了數(shù)據(jù)庫頭信息.
db.createCollection(“mycoll”, {capped:true, size:100000})
在 capped collection 中,你能添加新的對(duì)象。
能進(jìn)行更新,然而,對(duì)象不會(huì)增加存儲(chǔ)空間。如果增加,更新就會(huì)失敗 。
使用 Capped Collection 不能刪除一個(gè)文檔,可以使用 drop() 方法刪除 collection 所有的行。
刪除之后,你必須顯式的重新創(chuàng)建這個(gè) collection。
在 32bit 機(jī)器中,capped collection 最大存儲(chǔ)為 1e9( 1X109)個(gè)字節(jié)。
元數(shù)據(jù)
數(shù)據(jù)庫的信息是存儲(chǔ)在集合中,他們使用了系統(tǒng)的命令空間
dbname.system.*
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Ka0pWWiM-1690278972186)(./images/2022-10-20-17-17-01.png)]
MongoDB 的數(shù)據(jù)類型
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Fhmm99qw-1690278972187)(./images/2022-10-20-17-18-36.png)]
Object 類型:
object 類似是唯一主鍵,可以很快的去生成和排序,包含了 12bytes,
含義:
前 4 個(gè)字節(jié)表示創(chuàng)建的 unix 時(shí)間戳,后 3 個(gè)是機(jī)器標(biāo)識(shí)碼,然后是進(jìn)程 id,然后是隨機(jī)數(shù),
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-S7Lac1o0-1690278972188)(./images/2022-10-20-17-20-58.png)]
MongoDB 中存儲(chǔ)的文檔必須有個(gè)_id 鍵,這個(gè)鍵的值可以是任何類型的,默認(rèn)是個(gè) object 對(duì)象,
由于 ObjectId 中保存了創(chuàng)建的時(shí)間戳,所以你不需要為你的文檔保存時(shí)間戳字段,你可以通過 getTimestamp 函數(shù)來獲取文檔的創(chuàng)建時(shí)間:
> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")
objectld 轉(zhuǎn)為字符串: newObject.str
String(字符串):用于存儲(chǔ)文本數(shù)據(jù),例如姓名、地址、描述等。
Number(數(shù)字):用于存儲(chǔ)數(shù)值類型的數(shù)據(jù),包括整數(shù)和浮點(diǎn)數(shù)。
Boolean(布爾值):存儲(chǔ) true 或 false 兩個(gè)取值。
Date(日期):用于存儲(chǔ)日期和時(shí)間,以 ISO 格式進(jìn)行存儲(chǔ)。
Object(對(duì)象):用于存儲(chǔ)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),可以包含多個(gè)字段。
Array(數(shù)組):用于存儲(chǔ)多個(gè)值的列表。
Binary Data(二進(jìn)制數(shù)據(jù)):用于存儲(chǔ)二進(jìn)制數(shù)據(jù),例如圖片、音頻或視頻等。
ObjectId(對(duì)象 ID):用于存儲(chǔ)文檔的唯一標(biāo)識(shí)符,在集合中自動(dòng)生成。
Null(空值):表示沒有值的字段。
Undefined(未定義):表示字段未定義或不存在。
Regular Expression(正則表達(dá)式):用于存儲(chǔ)正則表達(dá)式模式。
除了上述常見的數(shù)據(jù)類型之外,MongoDB 還支持一些特殊的數(shù)據(jù)類型,例如 GeoJSON(地理空間數(shù)據(jù))、Timestamp(時(shí)間戳)等,以滿足不同類型數(shù)據(jù)的存儲(chǔ)需求。
時(shí)間戳
BSON 有一個(gè)特殊的時(shí)間戳類型用于 MongoDB 內(nèi)部使用,與普通的 日期 類型不相關(guān)。 時(shí)間戳值是一個(gè) 64 位的值。其中:
前 32 位是一個(gè) time_t 值,
后 32 位是在某秒中操作的一個(gè)遞增的序數(shù)
在單個(gè) mongod 實(shí)例中,時(shí)間戳的值通常是唯一的,在復(fù)制集群中,oplog 有一個(gè) ts 字段,這個(gè)字段中的值是使用 bson 時(shí)間戳表示的操作時(shí)間.
MongoDB - 連接
mongdb 服務(wù)安裝之后,需要先創(chuàng)建兩個(gè)目錄:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-C6euW6Fb-1690278972189)(2023-06-18-16-18-07.png)]
創(chuàng)建對(duì)應(yīng) data 目錄,然后使用下面的啟動(dòng)命令啟動(dòng),
啟動(dòng) MongoDB 服務(wù):
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
回顯成功,即可.
進(jìn)入管理 shell: (6.0 之后,需要自己安裝 shell 工具)
到 MongoDB 的安裝/bin 目錄下,執(zhí)行: ./mongo
mongodb://[username:password@]host1[:port1],host2[:port2],…[,hostN[:portN]]][/[database][?options]]
mongodb:// 這是固定的格式,必須要指定。
username:password@ 可選項(xiàng),如果設(shè)置,在連接數(shù)據(jù)庫服務(wù)器之后,驅(qū)動(dòng)都會(huì)嘗試登錄這個(gè)數(shù)據(jù)庫
host1 必須的指定至少一個(gè) host, host1 是這個(gè) URI 唯一要填寫的。它指定了要連接服務(wù)器的地址。如果要連接復(fù)制集,請指定多個(gè)主機(jī)地址。
portX 可選的指定端口,如果不填,默認(rèn)為 27017
/database 如果指定 username:password@,連接并驗(yàn)證登錄指定數(shù)據(jù)庫。若不指定,默認(rèn)打開 test 數(shù)據(jù)庫。
?options 是連接選項(xiàng)。如果不使用/database,則前面需要加上/。所有連接選項(xiàng)都是鍵值對(duì) name=value,鍵值對(duì)之間通過&或;(分號(hào))隔開
mongo 支持多個(gè)連接:
連接 replica pair, 服務(wù)器 1 為 example1.com 服務(wù)器 2 為 example2。: mongodb://example1.com:27017,example2.com:27017
連接 replica set 三臺(tái)服務(wù)器 (端口 27017, 27018, 和 27019): mongodb://localhost,localhost:27018,localhost:27019
用戶身份認(rèn)證
db.auth(“username”,“password”)
使用 rpm 安裝的 mongodb.進(jìn)入命令行:
mongoDB 語法
創(chuàng)建數(shù)據(jù)庫
建庫語句:
use DATABASE_NAME
(如果數(shù)據(jù)庫不存在,則進(jìn)行創(chuàng)建,否則切換到指定的數(shù)據(jù)庫)
查看所有數(shù)據(jù)庫:
show dbs;
注意: 庫中沒有數(shù)據(jù)時(shí)候是無法查看的,需要向其中插入數(shù)據(jù),在 MongoDB 中,集合只有在內(nèi)容插入后才會(huì)創(chuàng)建! 就是說,創(chuàng)建集合(數(shù)據(jù)表)后要再插入一個(gè)文檔(記錄),集合才會(huì)真正創(chuàng)建。
刪除數(shù)據(jù)庫:
db.dropDatabase()
默認(rèn)會(huì)刪除當(dāng)前的庫,可以使用 db,查看當(dāng)前的數(shù)據(jù)庫名
使用 use 進(jìn)入到指定庫中,然后執(zhí)行 db.dropDatabase().
創(chuàng)建集合:
db.createCollection(name,options)
說明:
name: 要?jiǎng)?chuàng)建的集合名稱,
options: 可選參數(shù),指定有關(guān)內(nèi)存大小及索引的選項(xiàng).
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-78jjzkBV-1690278972190)(./images/2022-11-09-18-14-43.png)]
在插入文檔時(shí),MongoDB 首先會(huì)檢查固定的集合的 size 字段,然后檢查 max 字段.
如
db.createCollection("runoob")db.createCollection("mycol", { capped : true, autoIndexId : true, size :6142800, max : 10000 } )
{ "ok" : 1 }
如果查看已經(jīng)有的集合,可以使用 show collections 或 showtables 命令:
在 MongoDB 中,你不需要?jiǎng)?chuàng)建集合,當(dāng)你插入一些文檔,mongoDB 會(huì)自動(dòng)創(chuàng)建集合,隱式創(chuàng)建的方式.
刪除集合:
db.collection_name.drop()
如果刪除成功則會(huì)返回 true,否則返回 false
插入文檔
文檔的數(shù)據(jù)結(jié)構(gòu)和 json 基本一樣,所有存儲(chǔ)在集合中的數(shù)據(jù)都是 bson 格式,
插入:
mongoDB 中使用的 inset()或 save()方法向集合中插入文檔:
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)
save():如果 _id 主鍵存在則更新數(shù)據(jù),如果不存在就插入數(shù)據(jù)。該方法新版本中已廢棄,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 來代替。
insert(): 如果插入的數(shù)據(jù)主鍵已經(jīng)存在,會(huì)拋出異常,提示主鍵已經(jīng)重復(fù),不保存當(dāng)前的數(shù)據(jù),
db.collection.insertMany() 用于向集合插入一個(gè)多個(gè)文檔,語法格式如下,最新用法:
db.collection.insertMany([ <document 1> , <document 2>, ... ],{writeConcern: <document>,ordered: <boolean>}
)
document:要寫入的文檔。
writeConcern:寫入策略,默認(rèn)為 1,即要求確認(rèn)寫操作,0 是不要求
ordered:指定是否按順序?qū)懭?#xff0c;默認(rèn) true,按順序?qū)懭搿?
以上實(shí)例 col 是我們的集合名稱,如果該集合在不在數(shù)據(jù)庫中,則會(huì)自動(dòng)創(chuàng)建給文檔的集合,并插入新的文檔. 這種方式就是隱式創(chuàng)建集合,在寫入文檔時(shí)候,創(chuàng)建集合.
也可以將數(shù)據(jù)定義為一個(gè)變量,document={}
然后再將變量傳入,db.col.insert(document)
更新文檔
update()方法用于更新已經(jīng)存在的文檔,語法格式:
db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document>}
)
db.users.updateMany({ age: { $gte: 30 } }, // 匹配條件,找出age大于等于30的文檔{ $set: { status: "active" } } // 更新操作,將匹配的文檔的status字段設(shè)置為"active"
);
query: update 的查詢條件,類型 where 子句,
update: update 的對(duì)象和一些更新的操作符等,也可以理解為 sql update 查詢內(nèi) set 后面的值,
upsert: 可選,表示如果存在 update 的記錄,是否插入 objnew,true 為插入,默認(rèn) false
multi: 默認(rèn)是 false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為 ture,就把這個(gè)條件查詢出來的多條記錄全部更新
writeConcern :可選,拋出異常的級(jí)別。
在更新文檔時(shí),可以使用多種操作符,包括 s e t 、 set、 set、inc、 u n s e t 等。 unset 等。 unset等。inc 操作符用于遞增或遞減字段的值,而 s e t 操作符用于設(shè)置字段的值。 set操作符用于設(shè)置字段的值。 set操作符用于設(shè)置字段的值。unset(用于刪除字段)、$push(用于向數(shù)組添加元素)
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 輸出信息
> db.col.find().pretty()
{"_id" : ObjectId("56064f89ade2f21f36b03136"),"title" : "MongoDB","description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫","by" : "菜鳥教程","url" : "http://www.runoob.com","tags" : ["mongodb","database","NoSQL"],"likes" : 100
}
>
以上語句只會(huì)修改第一條發(fā)現(xiàn)的文檔,如果你要修改多條相同的文檔,則需要設(shè)置 multi 參數(shù)為 true。
db.col.update({‘title’:‘MongoDB 教程’},{$set:{‘title’:‘MongoDB’}},{multi:true})
save()方法
save()方法是通過傳入的文檔來替換已有文檔,_id 主鍵存在就更新,不存在就插入,已經(jīng)廢棄
db.collection.save(<document>,{writeConcern: <document>}
)
document : 文檔數(shù)據(jù)。
writeConcern :可選,拋出異常的級(jí)別。
刪除文檔
建議使用 deleteOne()方法來刪除匹配條件的單個(gè)文檔,或者使用 deleteMany()方法來批量刪除匹配條件的多個(gè)文檔。
下面是一個(gè)示例,演示如何使用 deleteOne()方法刪除匹配條件的單個(gè)文檔:
// 刪除名為 “users” 的集合中匹配條件的數(shù)據(jù)(刪除第一個(gè)匹配的文檔)
db.users.deleteOne({ age: { $gte: 30 } });
const result = await db.users.deleteMany({ age: { $gte: 30 } });
console.log(result.deletedCount);
deleteMany()方法將刪除所有與匹配條件匹配的文檔,而不僅僅是第一個(gè)匹配文檔。
查詢操作
mongodb 中的表達(dá)式
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-3vY9Ve7v-1690278972191)(./images/2023-07-20-18-28-27.png)]
查詢語法:
查詢?nèi)?#xff1a; db.collection.find() 不帶參數(shù)回顯指定字段: db.collection.find({},{title:1,_id:0}) 1表示顯示,0表示不顯示,其中的第一個(gè){}表示查詢條件,第二個(gè){}表示要顯示的字段,_id默認(rèn)是顯示的,如果不顯示,需要設(shè)置為0查詢判斷: db.collection.find({likes:{$gt:100}}) 查詢likes大于100的數(shù)據(jù) $gt表示大于,$lt表示小于,$gte表示大于等于,$lte表示小于等于,$ne表示不等于
db.collection.find({status:"A"}) 這種表示返回status等于A的數(shù)據(jù)的全部字段信息。也可以使用多個(gè)匹配條件:
db.collection.find({staues:"A",likes:{$gt:100}
})
使用邏輯判斷:
db.collection.find({$or:[{status:"A"},{likes:{$gt:100}}]
}) 表示或的關(guān)系
db.collection.find({$and:[{status:"A"},{likes:{$gt:100}}]
}) 表示與的關(guān)系多條件查詢:
db.collection.find({$and:[{status:"A"},{likes:{$gt:100}}],$or:[{title:"MongoDB 教程"},{title:"C# 教程"}]
})
正則匹配:
db.collection.find({title:/^MongoDB/}) 表示title以MongoDB開頭的數(shù)據(jù)
匹配嵌套文檔:
測試數(shù)據(jù):
db.collection.insertMany([{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
])
在這里,size域是一個(gè)嵌套文檔。要匹配嵌套文檔,必須使用引號(hào)將整個(gè)嵌套文檔括起來,例如:
db.collection.find({size: {h: 14, w: 21, uom: "cm"}},{_id:0})
這里的匹配格式和位置很重要,不能出現(xiàn)錯(cuò)誤,否則無法匹配到數(shù)據(jù)。在嵌套的字段上查詢,使用點(diǎn)號(hào)(.)來指定嵌套字段,例如:
指定sized對(duì)象里面的uom屬性值查詢:
db.collection.find({"size.uom": "in"})查詢數(shù)組結(jié)構(gòu):
測試數(shù)據(jù):
db.size.insertMany([{item:"journal",qty:[5,15]},{item:"notebook",qty:[10,20]},{item:"paper",qty:[5,10]},{item:"planner",qty:[0,10]},{item:"postcard",qty:[15,15]}
])精確查詢:
db.collection.find({qty:{$eq:5}})
包含查詢:
db.collection.find({qty:{$in:[5,15]}},{_id:0})
不包含查詢:
db.collection.find({qty:{$nin:[5,15]}},{_id:0})
數(shù)組長度查詢:
db.collection.find({qty:{$size:2}},{_id:0}) # 查詢qty數(shù)組長度為2的數(shù)據(jù)查詢數(shù)據(jù)中滿足指定條件的元素,使用$elemMatch操作符,例如:
實(shí)例數(shù)據(jù):
{_id: 1,scores: [{ subject: 'Math', score: 90 },{ subject: 'English', score: 85 },{ subject: 'Science', score: 92 }]
}
現(xiàn)在我們想查詢 scores 數(shù)組中其中一個(gè)科目的分?jǐn)?shù)大于等于90的文檔,可以使用 $elemMatch 操作符來實(shí)現(xiàn):
db.collection.find({scores:{$elemMatch:{score:{$gte:90}}}})
如果要查詢科目
db.collection.find({scores:{$elemMatch:{subject:"Math"}}})
如果要組合查詢
db.collection.find({scores:{$elemMatch:{subject:"Math",score:{$gte:90}}}})
表示查詢 scores 數(shù)組中有一個(gè)元素的 subject 域等于 "Math",并且 score 域大于等于 90 的文檔。
文檔的排序插查詢:
通過關(guān)鍵字sort()來實(shí)現(xiàn)排序,1表示升序,-1表示降序,例如:
db.collection.find({status:"A"}).sort({user_id:1}}
注意,排序操作,sort是在find之外,而不是在find里面,否則會(huì)報(bào)錯(cuò)。
同時(shí)在find內(nèi)部做匹配操作,然后在find外部做排序操作。
查詢總數(shù):
mongodb中也是通過count方法進(jìn)行統(tǒng)計(jì)。
db.collection.find({status:"A"}).count() --指定字段查詢總數(shù)
db.collection.find({user_id:{$exists:true}}).count()
-- 其中的$exists表示user_id字段存在的數(shù)據(jù),如果不加$exists,表示user_id字段不存在的數(shù)據(jù)。
-- 該操作符主要用于檢查文檔中某個(gè)字段是否存在,如果存在返回true,否則返回false。
去重處理:
db.collection.distinct({status:"A"}) -- 去重status字段
db.collection.aggregate([{$group:{_id:"$status"_}]) -- 去重status字段
獲取指返回條數(shù),分頁查詢方法
使用 find().limit()方法來指定返回的條數(shù),例如:
db.collection.find().limit(2)
指定返回值的某條記錄
db.collection.find().limit(5).skip(10)
對(duì)比:select * from table limit 10,5
使用 limit 操作符限制返回的文檔數(shù)。limit 操作符接受一個(gè)整數(shù)參數(shù),表示需要返回的文檔數(shù)。
使用 skip 操作符指定跳過的文檔數(shù)。skip 操作符接受一個(gè)整數(shù)參數(shù),表示需要跳過的文檔數(shù)。
例如,假設(shè)有一個(gè)名為 books 的集合,我們需要查詢第二頁的 10 個(gè)文檔??梢园凑找韵虏襟E進(jìn)行操作:
計(jì)算每頁的文檔數(shù)。假設(shè)每頁顯示 10 個(gè)文檔,所以每次查詢應(yīng)該設(shè)置 limit 為 10。
計(jì)算要跳過的文檔數(shù)。對(duì)于第二頁,我們需要跳過前 10 個(gè)文檔,所以 skip 值為 10。
查詢 sql 語句的執(zhí)行情況:
與mysql類似,采用explain語句來查看
db.collection.find().explain()
使用所索引的情況
db.collection.find({status:"A"}).explain()
就可以查看到該 sql 語言執(zhí)行過程中是否采用了索引,以及它的索引類型等信息。
語句返回的基本內(nèi)容:
{"queryPlanner": {"plannerVersion": 1, //查詢計(jì)劃版本"namespace": "sang.sang_collect", //要查詢的集合"indexFilterSet": false, //是否使用索引"parsedQuery": {//查詢條件"x": {//查詢條件字段"$eq": 1.0 //查詢條件值}},"winningPlan": {//最終執(zhí)行的查詢計(jì)劃"stage": "COLLSCAN", //查詢的方式,常見有collscan/全表掃描, indexscan/索引掃描, FETCH/根據(jù)索引去檢索文檔獲取數(shù)據(jù), SHARD_MERGE/分片合并結(jié)果 IDHACK/根據(jù)_id去檢索文檔獲取數(shù)據(jù)"filter": {//查詢條件"x": {//查詢條件字段"$eq": 1.0 //查詢條件值}},"direction": "forward" //查詢方向 forward/正向,backward/反向 通常是采用正向索引查詢},"rejectedPlans": [] //被拒絕的查詢計(jì)劃},"serverInfo": {//服務(wù)器信息"host": "localhost.localdomain", //主機(jī)名"port": 27017, //端口號(hào)"version": "3.4.9", //版本號(hào)"gitVersion": "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e" //git版本號(hào)},"ok": 1.0 //是否成功
}
explain()也可以接受一個(gè)參數(shù),該參數(shù)是一個(gè)文檔,用于指定 explain 的模式,例如:
db.collection.find().explain(“executionStats”)
db.collection.find().explain(“allPlansExecution”)
db.collection.find().explain(“queryPlanner”)
參考鏈接:‘https://blog.csdn.net/user_longling/article/details/83957085’
命令總結(jié):
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ZDsDnEyr-1690278972193)(./images/2023-06-23-12-56-51.png)]
mongdb 中的索引類型
mongdb 的索引底層采用的是 b-tree,
這里簡單介紹一下大概的索引類型,后面會(huì)詳細(xì)介紹.
單鍵索引類型:
它支持所有數(shù)據(jù)類型中的單個(gè)字段的索引,并且可以在文檔的任何字段上定義,
對(duì)于單個(gè)字段索引,索引建的排序無關(guān)緊要,它是從任一方向上開始讀取索引,所以不注重順序
特殊: 過期索引 TTL
其中 TTL 索引是,支持文檔在一定時(shí)間之后,自動(dòng)過期刪除的,并且目前只能在單字段索引上建立,且字段類型必須為日期類型…
db.集合名.createIndex({“日期字段”:排序方式}, {expireAfterSeconds: 秒數(shù)})
復(fù)合索引
我們需要在多個(gè)字段的基礎(chǔ)上搜索表/集合,這是非常頻繁的。 如果是這種情況,我們可能會(huì)考慮在 MongoDB 中制作復(fù)合索引。 復(fù)合索引支持基于多個(gè)字段的索引,這擴(kuò)展了索引的概念并將它們擴(kuò)展到索引中的更大域。
需要注意: 字段順序,索引方向
db.集合名.createIndex( { “字段名 1” : 排序方式, “字段名 2” : 排序方式 } )
多鍵索引
針對(duì)屬性包含數(shù)組數(shù)據(jù)的情況,MongoDB 支持針對(duì)數(shù)組中每一個(gè) element 創(chuàng)建索引,Multikey indexes 支持 strings,numbers 和 nested documents
地理空間索引(Geospatial Index)
針對(duì)地理空間坐標(biāo)數(shù)據(jù)創(chuàng)建索引。
2dsphere 索引,用于存儲(chǔ)和查找球面上的點(diǎn)
2d 索引,用于存儲(chǔ)和查找平面上的點(diǎn)
db.company.insert({loc : { type: "Point", coordinates: [ 116.482451, 39.914176 ] },name: "大望路地鐵",category : "Parks"}
)
db.company.ensureIndex( { loc : "2dsphere" } )
# 參數(shù)不是1或-1,為2dsphere 或者 2d。還可以建立組合索引。
db.company.find({"loc" : {"$geoWithin" : {"$center":[[116.482451,39.914176],0.05]}}
})
全文索引
提供了針對(duì) string 內(nèi)容的文本查詢,text index 支持持任意屬性值為 string 或 string 數(shù)組元素的索引查詢。注意:一個(gè)集合僅支持最多一個(gè) Text Index,中文分詞不理想 推薦 ES。
db.集合.createIndex({“字段”: “text”})
db.集合.find({“KaTeX parse error: Expected '}', got 'EOF' at end of input: text": {"search”: “coffee”}})
哈希索引 (Hashed Index)
針對(duì)屬性的哈希值進(jìn)行索引查詢,當(dāng)要使用 Hashed index 時(shí),MongoDB 能夠自動(dòng)的計(jì)算 hash 值,無需程序計(jì)算 hash 值。注:hash index 僅支持等于查詢,不支持范圍查詢。
db.集合.createIndex({“字段”: “hashed”})
索引操作
索引的查看: db.comment.getIndexs() ,查看所有的索引
索引的創(chuàng)建:
db.collection.createIndex(keys,options)
其中 key,是索引的字段,option 是對(duì)索引的具體設(shè)置.
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-mq5ywxAQ-1690278972194)(./images/2023-06-18-16-50-16.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-fCpRli5c-1690278972194)(2023-06-18-16-51-11.png)]
db.mycol.createIndex({userid:1}) 這里 1 代表升序,-1 是降序
索引的刪除: db.collection.dropIndex(index)