
這是mongo第二篇「查詢基礎篇」,后續會連續更新6篇
mongodb的文章總結上會有一系列的文章,順序是先學會怎么用,在學會怎么用好,戒急戒躁,循序漸進,跟着我一起來探索交流。
通過上一篇基礎篇的介紹,我相信大家對我有了初步的認識,並且能夠簡單的使用我了,在使用過程中我相信大家用的最多的還是查詢吧,今天我就和大家一起來總結查詢基礎哪一些事吧。如果有總結的不到位的地方,希望您多多指點。
01:查詢簡介
查詢mongdodb提供了兩個方法:find()和findOne(),前者是查詢符合要求的所有數據,后者只查詢符合要求的第一條數據,兩者的參數都一樣,具有兩個參數,並且兩個參數都是選填。
命令格式:db.collection.find(query,projection) ,兩個參數都是非必填。
query:是一個查詢條件BJSON對象,根據查詢條件構建對應的BJSON對象。如:
db.user.find({name:"name對應的值"},{sex:"sex對應的值"})
projection:設置查詢需要返回的字段集合,不設置代表返回全部字段,其格式為:{字段名稱:是否獲取..},當設置為1代表需要獲取,注意:_id默認值為1,所以需要查詢結果不需要_id,那么需要設置其值為0。
說上去自我感覺還是有點空洞,還是上一個一些實例吧!
數據初始化:
向數據庫testdb的user集合初始化如下三條數據
use testdb db.user.insert([{name:"序員修煉之旅",age:2,from: "CTU"}, {name: "mongdo",age:13,from: "USA"}, {name: "C++",from: "USA" ,author:["xiaoxu","xiaozhang"]}])
數據查詢實例 :
// 查詢全部數據 db.user.find() // 查詢結果:返回剛剛初始化的3條數據全部數據 // 查詢name=程序員修煉之旅,並且只返回節點 name和from db.user.find({name:"序員修煉之旅"},{_id:0,name:1,from:1}) // 查詢結果為: { "name": "序員修煉之旅","from": " CTU" } //查詢所有數據,並且只返回節點 name和from db.user.find({},{_id:0,name:1,from:1}) // 查詢結果 [{"name": "序員修煉之旅","from": "CTU"}, {"name": "mongdo","from": "USA"}, {"name": "C++","from": "USA"}] // 只查詢一條數據,其它查詢條件和返回字段兩個參數和find方法一直,不在細說 db.findOne()
基礎查詢小結,通過上面的實例操作,其實我們不難發現:
1、find和findOne使用上一樣,findOne查詢一條,find查詢所有
2、查詢的有兩個參數,並且兩個參數都是非必填
3、projection設置時,_id默認返回,如不返回需要手動設置為0
02:查詢條件探索
通過查詢簡介我們應該對查詢有了初識印象,也許你會疑惑,查詢就這么簡單啊,解決不了實際工作需要啊,比如查詢年齡在20-30之間的用戶。不急不急,下面的探索專門就是解決這一些問題而來的。
先從簡單的單個查詢符號說起,掌握了單個查詢符號,至於復雜的查詢條件就很簡單了,就像拼積木一樣根據規則組裝即可。
單個查詢符的命令格式為:db.collection.find({字段:{查詢符:值}})
mongodb的單個查詢符包括:
比較符(等於[嚴格來說等於不是一個查詢符]、不等於、大於、小於、大於等於、小於等於);
包含符(包含、不包含、全包含);模糊匹配符(左匹配、右匹配、模糊匹配、全部匹配);
元素操作符(字段是否存在、字段值是否為空、字段類型);
集合查詢符(長度、子查詢);
取模符;
正則表達式。
哈哈聲明一下,上面說到的7個查詢符是我自己的總結歸類,如有不妥之處,多多指點。總結下來,發現查詢符號還是蠻多的,下面我們將一一來介紹每一個查詢符的使用:下面的實例還是繼續沿用上面舉例中的數據庫操作。
初始化一下數據庫:
db.user.insert({name:".net",age:88,author: ["xiaoxu","xiaozhang","xiaoliu"]})
NO.1 【比較符】
符號:$ne (不等於)
說明:和等於剛剛相反,包括沒有該字段的文檔數據
語法: {field:{$ne:<值>}}
實例:
// 查詢from!="USA"的數據 db.user.find({from: {$ne: "USA"}}) // 結果查詢出來序員修煉之旅和.net兩條數據
符號:$gt(大於)
說明:針對字段類型為數字的文檔,其值大於指定值的文檔數據
語法:{field:{$gt:<值>}}
實例:
// 查詢age>13的數據 db.user.find({age: {$gt:13}}) // 結果只查詢出.net一條數據
符號:$gte (大於等於)
說明:針對字段類型為數字的文檔,其值大於等於指定值的文檔數據
語法:{field:{$gte:<值>}}
實例:
// 查詢age>=13的數據 db.user.find({age: {$gte:13}}) // 結果查詢出mongo和.net兩條數據
符號:$lt(小於)
說明:針對字段類型為數字的文檔,其值小於指定值的文檔數據
語法: {field:{$lt:<值>}}
實例:
// 查詢age<13的數據 db.user.find({age: {$lt:13}}) // 結果只查詢出序員修煉之旅一條數據
符號:$lte(小於等於)
說明:針對字段類型為數字的文檔,其值小於等於指定值的文檔數據
語法: {field:{$lte:<值>}}
實例:
// 查詢age<=13的數據 db.user.find({age: {$lte:13}}) // 結果查詢出序員修煉之旅和mongo兩條數據
NO.2 【包含符】
符號:$in(包含)
說明:如果被查詢字段為非集合,被查詢字段的值在條件集合里即可;如果被查詢的字段為集合,那么被查找的字段只要有一個只包含在條件集合即可。
語法: {field:{$in:[值1,值2..]}}
實例:
// 查詢from在["CTU","USA"]的數據 db.user.find({from: {$in:[ "CTU","USA"]}}) // 結果查詢出序員修煉之旅、mongo和c++三條數據 // 查詢author在["xiaoxu"," xiaowang"]的數據 db.user.find({author:{$in:["xiaoxu","xiaowang"]}}) // 結果查詢出序員修煉之旅、mongo兩條數據
符號:$nin(不包含)
說明:和包含剛剛相反,查詢結果包括兩類數據:有該字段,但是該字段的值都在條件集合內的文檔數據;沒有該字段的文檔數據。
語法:{field:{$nin:[值1,值2..]}}
實例:
// 查詢from不在["CTU","USA"]的數據 db.user.find({from: {$nin:[ "CTU","USA"]}}) // 結果只查詢出 .net 一條數據 // 查詢author不在["xiaoliu","xiaowang"]的數據 db.user.find({author:{$nin:["xiaoliu","xiaowang"]}}) // 結果查詢出序員修煉之旅、mongdo和c++三條數據
符號:$all(全包含)
說明:和包含很相似,包含是全包含的一個子集,全包含只是被查詢字段包含查詢條件的所有值。主要使用於字段為集合的文檔數據查詢
語法:{field:{$all:[值1,值2..]}}
實例:
// 查詢author全部包含["xiaoxu","xiaozhang"]的數據 db.user.find({author:{$all:["xiaoxu","xiaozhang"]}}) // 結果查詢出c++和.net兩數據 // 查詢author全部包含["xiaoxu","xiaoliu"]的數據 db.user.find({author:{$all:["xiaoxu","xiaoliu"]}}) // 結果沒有一條數據符合要求
NO.3 【模糊匹配符】
模糊查詢對應的就是SQL中的like查詢,mongodb模糊查詢通過/符合來實現,和SQL中的%對應,其實模糊查詢就是正則表達式的一個簡寫方式,廢話不多說,直接上案例!
符號:/^X/ (左匹配)
說明:匹配以X開始的所有集合數據
實例:
// 查詢name 以 程 開始的集合數據 db.user.find({name:/^序/}) // 結果只查詢出 序員修煉之旅 一條數據
符號:/X$/(右匹配)
說明:匹配以X結束的所有集合數據
實例:
// 查詢name 以 旅 結束的集合數據 db.user.find({name:/旅$/}) // 結果只查詢出 序員修煉之旅 一條數據
符號:/X/ (模糊匹配)
說明:匹配包含X的所有集合數據
實例:
// 查詢name 以 程序員 的集合數據 db.user.find({name:/程序員/}) // 結果查詢出 序員修煉之旅 一條數據
符號:/^X$/(全匹配)
說明:既以X開頭也以X結尾的所有集合數據,其實就是等於X的數據集合;等價於”X”
實例:
// 查詢name =序員修煉之旅 的集合數據 db.user.find({name:/^序員修煉之旅$/}) // 結果查詢出 序員修煉之旅 一條數據
符號:i(不區分大小寫)
說明:在模糊匹配度后面添加i在匹配過程中不區分大小寫
實例:
// 查詢from中包括t的數據,包括t和T db.user.find({from:/t/i}) // 結果查詢出 序員修煉之旅 一條數據
NO.4 【元素操作符】
為了演示效果,查詢一條新數據
db.user.insert({name:"java",age:"保密",author:null})
符號:$exists(字段是否存在)
說明:對應的值為bool,當為true:查找存在改字段的文檔數據(包括字段的值為空);false:查詢不存在改字段的文檔數據
語法:{field:{$exists:<boole>}}
實例:
// 查詢包含author的集合數據 db.user.find({author:{$exists:true}}) // 查詢出c++、.net、java三條數據 // 查詢不包含author的集合數據 db.user.find({author:{$exists:false}}) // 查詢出序員修煉之旅、mongdo兩條數據
符號:null(字段值是否為空)
說明:查詢兩類數據,不存在節點的文檔數據和存在改節點但是數據為null的文檔數據。相對$exists:false 多了一類值為null的文檔數據
語法:{field: null }
實例:
db.user.find({author: null }) // 查詢出序員修煉之旅、mongdo、java三條數據
符號:$type(字段類型)
說明:根據字段的類型來查詢,具體的字段類型是一個枚舉值,枚舉值關系請在網上查詢,不在此列舉!
語法:{field:{$type:<類型枚舉值number>}}
實例:
// 查詢age為數值的文檔數據 db.user.find({age:{$type:1}}) // 結果查詢出 序員修煉之旅、mongdo、.net 三條數據 // 查詢age為字符串的文檔數據 db.user.find({age:{$type:2}}) // 結果查詢出java 一條數據
NO.5 【集合查詢符】
初始化一條數據:
db.user.insert({name:"python",author:[{authorName:"王強",date:"2020-11-06"},{authorName:"劉強",date:"2020-11-01"}]})
符號:$size(長度)
說明:針對節點數據為一個子集合的數據,查詢對應節點的子集長度
語法:{fild:{$size:<numbr>}}
實例:
// 查詢author的長度為3的數據 db.user.find({author:{$size:3}}) // 查詢出.net一條數據 // 查詢author的長度為1的數據 db.user.find({author:{$size:1}}) // 未查詢出任何數據
符號:$elemMatch(子查詢)
說明:子查詢具體的查詢條件和上面的查詢條件方式一樣,只是做了一個嵌套查詢,查詢出子查詢有數據的文檔數據
語法:{fild:{$elemMatch:{子查詢條件}}}
實例:
// 查詢author中的authorName為王強的數據 db.user.find({author:{$elemMatch:{authorName:"王強"}}}) // 結果查詢出python一條數據
子查詢擴展
說明:子查詢的語法還支持外節點.子節點模式。
語法:{"外節點.子節點":子查詢條件}
實例:
// 查詢author中的authorName為王強的數據 db.user.find({author.authorName:"王強"}) // 結果查詢出python一條數據
NO.6 【取模符】
符號:$mod(取模)
說明:簡答的說就是除一個數的余數查詢
語法:{fild:{$ mod:[value,value2]}}
實例:
// 查詢age除 3 余數為2的數據 db.user.find({age:{$mod:[3,2]}}) // 查詢出序員修煉之旅一條數據
NO.7 【正則表達式】
符號:$regex(正則匹配)
說明:mongodb查詢中的正則匹配和js中的正則匹配一致,如果會js中的正則匹配就輕松上手。幾個關鍵詞及其注意:
1、^ 取反的意思,用特殊的轉義字符需要在前面加一個斜杠;
2、通過 ^取反 ,再通過$not取反,就可獲得只包含一種類型的數據
\\d 數字
\\s 空格
\\w 數字和字母
語法:{fild:{$ regex:正則表達式, $options: "options值" }}
其中$options可改變匹配規則,是幾個固定的枚舉值(i,m,x,s),但是不同枚舉值可以組合使用,具體枚舉值如下:
i: 忽略大小寫;
m: 多行匹配模式,會更改^和$元字符的默認行為,分別使用與行的開頭和結尾匹配,而不是與輸入字符串的開頭和結尾匹配。
x: 忽略非轉義的空白字符,正則表達式中的非轉義的空白字符將被忽略,同時井號(#)被解釋為注釋的開頭注,只能顯式位於option選項中。
s: 單行匹配模式,會改變模式中的點號(.)元字符的默認行為,它會匹配所有字符,包括換行符(\n),只能顯式位於option選項中。
// 列舉幾個平時工作中常用到的查詢方式 // 查詢 name中包含 字母大寫 O的數據,區分大小寫 db.user.find({age:{$regex:"O"}}) // 未查詢到任何數據 // 查詢 name中包含 字母大寫 O的數據,不區分大小寫 db.user.find({name:{$regex:"O",$options:"$i"}}) // 查詢出 mongdo、python兩條數據數據 // 查詢from字段中以C開始U結尾的數據 db.user.find({from:{$regex:"^C\\wU$"}}) // 查詢出序員修煉之旅一條數據 // 查詢age包含中文的數據 db.user.find({age:{$regex:"[\u4e00-\u9fa5]"}}) // 結果值查詢java 一條數據 // 查詢age不包含中文的數據 db.user.find({age:{$not:{$regex:"[\u4e00-\u9fa5]"}}}) // 查詢出來了序員修煉之旅、mongdo、C++、.net、python // 查詢name只包含字母的數據,^ 取反的意思 db.user.find({"name":{$not:{$regex:"[^a-zA-z\\s]"}}}) // 查詢出mongdo、java、python 三條數據 // 查詢name只包含漢字的數據,可包含空格 db.user.find({"name":{$not:{$regex:"[^\\s\u4e00-\u9fa5]"}}}) // 只查詢出 程序員修煉之旅 一條數據
03:小結
好了,這一篇就先總結到這,通過本篇文章的總結,對mongodb的單個查詢符操作已經有了比較清晰的認知和實操,當然查詢實際使用不僅僅是這么簡單的,還有單個查找組合的邏輯查詢,已經對應的其它的函數(條數、分頁查詢等),后續專門拿一篇文章來總結分享。歡迎持續關注。
END
原創不易,感謝掃描支持,獲取更多精彩,謝謝:

點一個推薦,你最好看
