您好,登錄后才能下訂單哦!
MongoDB基本查詢條件操作符都有哪些,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
簡介
MongoDB中使用find函數來進行查詢。查詢最終返回的是一個集合中文檔的子集,子集合包括0個文檔到這個集合中所有的文檔。
【第一個查詢參數】
find函數第一個參數是一個文檔,其中給出了我們要查詢集合中什么樣文檔的描述。如果我們要查詢所有文檔,可以不帶任何參數調用find函數,或第一個參數為空文檔{},如下例:
對于第一個代表查詢參數的文檔,我們該如何理解呢?比如我們執行 db.people.find({"age":18}),這個函數實際表示我們要查詢鍵"age"的值為18的文檔,鍵“age”的值不等于18或不存在這個鍵的文檔均不會被查詢到。再比如我們執行這個函數:db.people.find({"name":"jimmy", "age":18}),這個實際表示得是查詢鍵“name”的值為"jimmy"并且鍵"age"的值為18的文檔,即查詢文檔中各個條件是AND的關系!
在使用第一個參數時,我們需要注意一點:該查詢文檔中“鍵值對”中的值必須為常量!
【第二個查詢參數】
上例中,我們不指定或只指定find函數第一個參數查詢得到的文檔,會包含原集合文檔所有的鍵值對。這種情況對于某些鍵值對特別多的文檔并不適用,因為我們可能只關心該文檔的某幾個鍵值對。這時我們可以使用find函數的第二個參數,來指定返回的鍵值對,這樣還可以減少傳輸的數據量從而加快效率。第二個參數同樣是個文檔,如下例:
使用find函數第二個參數,對于這個文檔我們有這些要注意的:
1》 對于非"_id"的所有鍵,其值要么同時不等于0(表明要查詢該鍵值對),要么同時等于0(表明要忽略該鍵值對),否則執行報錯。
2》 對于非“_id”的所有鍵,如果其值全部為0,則此時如果也指明了鍵“_id”的情況,則鍵“_id”的值必須為0,否則執行報錯。
3》 對于鍵“_id”,如果不指名其值,則查詢結果中肯定包含這個鍵值對,如果不想包含,可以指明其值為0即可。
綜上,我們總結一下如果需要使用第二個參數,則使用的技巧為:指明所有需要得到的鍵的值為非0的數字,如果還要過濾鍵"_id",則再指明"_id"這個鍵值為0即可。
【查詢條件】
上面提到的查詢條件,都是精確匹配,即“=”多少。MongoDB中的查詢顯然還有更復雜的匹配。比如范圍,OR子句和取反等。我們分別進行介紹。
“$lt”、“$lte”、“$gt”、“$gte” 就是所有的范圍比較操作符,分別對應<、<=、>、>=。將他們組合應用,就可以查詢值在某個范圍內的文檔了,比如我們要查詢18-30歲(含)的所有用戶:
這種范圍查詢操作符,除用在值為數字的鍵之上外,對于值為日期的鍵的范圍匹配也尤為好用!比如我們要查詢注冊日期在2007/05/01前的用戶信息,我們可以這樣寫:
有時我們需要查詢某個鍵不等于某個值的文檔,我們可以使用這個條件操作符"$ne",他表示不相等。如我們要查詢注冊用戶名不等于“tom”的文檔:
條件操作符"$ne"適合于所有類型的值!
【OR查詢】
MongoDB中有兩種方式進行OR查詢:“$in”可以用來查詢一個鍵的多個值,“$or”則更通用一些,可以用來完成多個鍵值對的組合。我們也分別演示一下:我們要查詢獎券號碼為10,20,30 的所有投注者的姓名:
但如果還要求我們查詢出獎券號碼為10,20,30 或投注者姓名為“tim”的所有投注信息,我們單純用"$in"是無法勝任的,我們可以用操作符"$or",“$or”操作符可以組合其他操作符如"$in"拼湊的條件:
使用“$or”操作符,其值為一個條件數組,數組中各個條件最后通過or組合。使用這個條件操作符有一個最佳實踐是:將最寬松的條件放在前面,這樣可以加快文檔匹配速度!
【$mod 和 $not】
$mod操作符,使用格式為 {"鍵":{"$mod":[num1, num2]}},查詢“鍵”的值對num1取余,如果這個值等于num2,則整條文檔符合條件。如我們要查詢所有在其本命年的用戶(年齡是12的整數倍):
$not是元條件符,即可以用于任何其他條件之上的,表明取反,還是上面的例子,我們這次要查所有不在其本命年的用戶文檔信息:
$not條件符配合正則表達式使用非常強大,這里先預報一下,我們后續會提到引入正則表達式的查詢。
【特定于類型的查詢】
查詢某鍵,其值為null的文檔時,我們會發現一個奇怪的現象,我們先看一個例子:
利用值為null的條件貌似可以查詢正確的文檔,但我們忽略了如果集合中存在沒有鍵"y"的文檔,會出現什么情況:
果然不出意外,沒有這個鍵的文檔同樣匹配值為null這種條件,如果我們需要過濾掉這種文檔,需要另外一個條件操作符$exists,指明這個鍵必須存在:
我們發現,因為MongoDB中沒有提供類似于"$eq"這種相等的條件操作符,所以“=null”的判斷只能通過{"$in":[null]}來實現!
【正則表達式】
正則表達式在任何語言中都是操作字符串的一大利器!在MongoDB的查詢中,其依然威力不減。正則表達式可以靈活的匹配字符串類型的值。如我們要查詢所有姓名為“joy”開頭并且忽略大小寫的用戶文檔:
Shell中寫正則表達式的方式和JavaScript的一致,寫在一對“ // ”之間的就是正則表達式。具體正則表達式的一些寫法大家可以參考正則表達式的相關規范。我們上面提到了操作符$not和正則表達式的聯合使用,我們這邊也演示一下:
我們可以看到使用$not是將其作為正則表達式的鍵,表明和這個正則表達式不匹配。我們在最前邊也介紹了,MongoDB支持正則表達式這種數據類型,即“鍵值對”中允許“值”為正則表達式,對于這種鍵值對,正則表達式也可以匹配成功:
但注意正則表達式的匹配必須是完全匹配,即正則表達式的寫法完全相同才可以匹配成功(這個在實際應用中基本不會遇見的)。
MongoDB可以為前綴型的正則表達式(/^joe/i)查詢使用索引,所以這種前綴型的正則表式查詢速度會很快!
這里再稍微提一下find函數和findOne函數的區別,剛才說了,find函數返回的是一個子集,而findOne就是返回一條文檔或null(未查詢到結果),對于一些可以接受文檔做參數的函數如insert,可以直接使用findOne的返回值作為參數。
最后就這基本的查詢條件操作符部分稍作總結,因為我們前面介紹修改器操作符也是以"$"開頭,如“$set”,"$inc"等,這里介紹的查詢條件操作符也是以"$"開頭,那使用上有哪些區分呢?修改器操作符都是外層文檔的鍵,而查詢條件的操作符基本都是內層文檔的鍵(注意“$or”是一個例外)。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。