MongoDB創(chuàng)建和查詢視圖的方式
本文整理mongodb的官方文檔,介紹mongodb的視圖創(chuàng)建和查詢。
Mongodb中,允許使用兩種方式來創(chuàng)建視圖。
//使用db.createCollection()來創(chuàng)建視圖 db.createCollection( "<viewName>", { "viewOn": "<source>", "pipeline": [<pipeline>], "collation": {<collation>} } ) //使用db.createView()來創(chuàng)建視圖 db.createView( "<viewName>", "<source>", [<pipeline>], { "collation": { <collation>} } )
限制和注意事項
- 創(chuàng)建視圖時,要創(chuàng)建的視圖需要與依賴的集合在同一個數(shù)據(jù)庫。
- 在普通視圖的定義的管道中中,不能出現(xiàn)$out和$merge過程。在$lookup或$facet過程中也不能出現(xiàn)$merge和$out。
- 視圖創(chuàng)建后,不可以被重新命名,不可以修改視圖名稱。
- 視圖中,不能夠使用mapReduce(), $text, $geoNear等命令。
- Mongodb查看集合的操作,如db.getCollectionInfos()和db.getCollectionNames()命令,結(jié)果集中會包含用戶定義的視圖信息。
- 視圖的定義對用戶是可見的,使用命令db.getCollectionInfos()或通過explain查詢執(zhí)行計劃時,打印出來的信息會包含視圖的定義信息。因此,用戶需要在定義視圖中避免直接引用敏感字段和字段值。
- 使用AtlasUI,用戶只能創(chuàng)建物化視圖。
- 使用find()命令查詢視圖中,不支持操作符$, $elemMatch, $slice, $meta
- 使用db.collection.find()方法查詢視圖時,filter, projection, sort, skip, limit等查詢方法,轉(zhuǎn)化成等價的集合管道查詢方法。
- Mongodb將客戶端視圖查詢條件與視圖定義中的管道操作一起進行查詢優(yōu)化
- 查詢優(yōu)化器不會改變視圖的查詢結(jié)果,只是重新編排管道中查詢操作的順序來提高效率。
- 使用db.createView()命令創(chuàng)建視圖的過程中,會在依賴的集合上加鎖。所有對該集合的操作需要等視圖創(chuàng)建結(jié)束后才能執(zhí)行。
- 創(chuàng)建視圖的過程中,Mongodb會在system.view集合上加鎖,當創(chuàng)建視圖結(jié)束后,該鎖才會被釋放。
應用兩種方式創(chuàng)建視圖
構(gòu)建一個student集合,用于創(chuàng)建視圖
db.students.insertMany( [ { sID: 22001, name: "Alex", year: 1, score: 4.0}, { sID: 21001, name: "bernie", year: 2, score: 3.7}, { sID: 20010, name: "Chris", year: 3, score: 2.5}, { sID: 22021, name: "Drew", year: 1, score: 3.2}, { sID: 17301, name: "harley", year: 6, score: 3.1}, { sID: 21022, name: "Farmer", year: 1, score: 2.2}, { sID: 20020, name: "george", year: 3, score: 2.8}, { sID: 18020, name: "Harley", year: 5, score: 2.8} ])
使用db.createView()創(chuàng)建一個視圖,查詢出一年級學生的數(shù)據(jù)
db.createView( "V_firstYears", //視圖名稱 "students", //基于集合students創(chuàng)建視圖 [{ $match: {year: 1}}] //集合查詢,匹配students表中一年級學生的數(shù)據(jù) )
查詢集合V_firstYears的數(shù)據(jù)
db.V_firstYears.find({},{_id: 0}) //使用{_id: 0}關(guān)閉返回結(jié)果中文檔id /* 1 createdAt:12/25/2023, 4:01:19 PM*/ { "_id" : ObjectId("658936cfe0ac6d3d14d04bde"), "sID" : 22001, "name" : "Alex", "year" : 1, "score" : 4 }, /* 2 createdAt:12/25/2023, 4:01:19 PM*/ { "_id" : ObjectId("658936cfe0ac6d3d14d04be1"), "sID" : 22021, "name" : "Drew", "year" : 1, "score" : 3.2 }, /* 3 createdAt:12/25/2023, 4:01:19 PM*/ { "_id" : ObjectId("658936cfe0ac6d3d14d04be3"), "sID" : 21022, "name" : "Farmer", "year" : 1, "score" : 2.2 }
使用db.createCollection()方法創(chuàng)建一個查詢畢業(yè)生的視圖。
db.createCollection( "v_graduateStudents", { viewOn: "students", pipeline: [ { $match: { $expr: { $gt: ["$year", 4]}}}],//查詢超過4年的數(shù)據(jù) collation: { locale: "en", caseFirst: "upper"} //添加字符序定義,指定排序方法 } )
查詢定義的畢業(yè)生視圖。查詢過程中,添加了按照學生姓名進行排序。定義視圖時指定了按照大寫字母優(yōu)先的排序規(guī)則,則Harey排在前面。
db.v_graduateStudents.find({},{_id: 0}).sort('name') /* 1 */ { "sID" : 18020, "name" : "Harley", "year" : 5, "score" : 2.8 }, /* 2 */ { "sID" : 17301, "name" : "harley", "year" : 6, "score" : 3.1 }
刪除視圖,重新建立一個小寫字母優(yōu)先的字符序規(guī)則
db.v_graduateStudents.drop() db.createCollection( "v_graduateStudents", { viewOn: "students", pipeline: [ { $match: { $expr: { $gt: ["$year", 4]}}}], collation: { locale: "en", caseFirst: "lower"} } )
查詢新建的視圖,返回結(jié)果與前面的排序結(jié)果不同。
db.v_graduateStudents.find({},{_id: 0}).sort('name') /* 1 */ { "sID" : 17301, "name" : "harley", "year" : 6, "score" : 3.1 }, /* 2 */ { "sID" : 18020, "name" : "Harley", "year" : 5, "score" : 2.8 }
到此這篇關(guān)于MongoDB創(chuàng)建和查詢視圖的文章就介紹到這了,更多相關(guān)MongoDB查詢視圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章

MongoDB數(shù)據(jù)庫基礎(chǔ)知識整理

mongodb使用docker搭建replicaSet集群與變更監(jiān)聽(最新推薦)

MongoDB通過查詢與游標徹底玩轉(zhuǎn)分布式文件存儲

在Linux服務(wù)器中配置mongodb環(huán)境的步驟