我叫Mongo,收了「查詢基礎篇」,值得你擁有


這是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
原創不易,感謝掃描支持,獲取更多精彩,謝謝:

點一個推薦,你最好看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM