一、引言
上一篇文章我們已經介紹了MongoDB數據庫的查詢操作,但是並沒有介紹全,隨着自己的學習的深入,對查詢又有了新的東西,決定補充進來。如果大家想看上一篇有關MongoDB查詢的文章,可以點擊這里《MongoDb進階實踐之四 MongoDB查詢命令詳述》,第一篇文章詳細介紹了有關MongoDB查詢的有關命令和操作符。廢話不多說,今天主要的任務就是把有關MongoDB查詢命令的新的東西補充進來,文章的序號,我是接着上一篇文章來的,沒有重頭來說,這樣大家也就知道今天是有關MongoDB查詢之四的補充了。好了,馬上開始我們今天的寫作吧。
二、MongDB查詢的詳解(補充)
我比較直接,直接上內容,有關查詢的每個方法都有示例代碼,應該不是很難。大家注意,序號不是從1開始的,因為是補充的,大家可以結合上一篇文章一起來看。
12、$in 操作符:在一個數組中查詢匹配的文檔,查詢條件的值可以有多個,條件可以滿足一個或者多個
語法:db.collectionName.find({<key>:{$in:[value1,value2...valuen]}})
參數說明:
key:要操作的字段名稱
$in:操作符,在一個數組中選擇符合條件的文檔
value1-n:查詢條件要滿足的值,可以有多個值,可以滿足一個,兩個,或者多個
$in操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "userName" : "lilei", "sex" : "1", "age" : "21", "address" : "guangxi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "userName" : "HanMeiMei", "sex" : "0", "age" : "18", "address" : "JiangXi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } //查詢結果 > db.students.find({"age":{"$in":["21","18"]}}) { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "userName" : "lilei", "sex" : "1", "age" : "21", "address" : "guangxi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "userName" : "HanMeiMei", "sex" : "0", "age" : "18", "address" : "JiangXi" } >
13、$nin 操作符:和$in操作符相反,選擇不符合數組條件的所有文檔
語法:db.collectionName.find({<key>:{$nin:[value1,value2...valuen]}})
參數說明:
key:要操作的字段名稱
$nin:操作符,在一個數組中選擇不符合條件的文檔
value1-n:查詢條件要滿足的值,可以有多個值,可以滿足一個,兩個,或者多個
$nin操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "userName" : "lilei", "sex" : "1", "age" : "21", "address" : "guangxi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "userName" : "HanMeiMei", "sex" : "0", "age" : "18", "address" : "JiangXi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } //查詢結果 > db.students.find({"age":{"$nin":["26"]}}) { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "userName" : "lilei", "sex" : "1", "age" : "21", "address" : "guangxi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "userName" : "HanMeiMei", "sex" : "0", "age" : "18", "address" : "JiangXi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" }
14、$and 操作符:該操作符用於連接多個條件,只有當每個條件必須都是為true,整個條件的集合才會返回true,表示條件成立,然后就會返回符合條件的文檔
語法:db.collectionName.find({$and:[{query1},{query2}...{queryn}]})
參數說明:
$and:操作符,每個條件都必須返回true,整個條件集合才回返回true;如果有一個條件返回false,整個條件結果就是false。
query1-n:具體的查詢條件,可以有多個查詢條件,只有所有條件返回true,整個條件集合才回返回ture,表示成功。
$and操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "userName" : "lilei", "sex" : "1", "age" : "21", "address" : "guangxi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "userName" : "HanMeiMei", "sex" : "0", "age" : "18", "address" : "JiangXi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } //查詢結果 db.students.find({"$and":[{"age":"21"},{"sex":"1"}]}) { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "userName" : "lilei", "sex" : "1", "age" : "21", "address" : "guangxi" } >
15、$not 操作符:該操作符用於對當前的條件取反,要和其他操作符配合使用。比如,我可以取性別不是男的所有的文檔,也可以獲取年齡不包含44和55歲的人的文檔
語法:db.collectionName.find({<key>:{"$not":{"$in":[value1,value2...valuen]}}})
參數說明:
key:在字段是要進行條件篩選的字段名。
$not:操作符,對條件進行取反,通常會和其他操作符配合使用。
value1-n:具體需要過濾的值,可以是多個值,$in操作符表示符合這些條件,$not操作符就是對$in操作符的條件取反
$not操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "userName" : "lilei", "sex" : "1", "age" : "21", "address" : "guangxi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "userName" : "HanMeiMei", "sex" : "0", "age" : "18", "address" : "JiangXi" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } //查詢結果,查詢年齡不是21和18歲的其他人 > db.students.find({"age":{"$not":{"$in":["21","18"]}}}) { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } >
16、$all 操作符:是針對數組字段操作的,可以完成類似模糊查詢的效果,並且和字段值的順序無關。一般Mongodb數組字段的查詢,都是精確查詢,並且和字段的順序有關。
語法:db.collectionName.find({<key>:{$all:[value1,value2...valuen]}})
參數說明:
key:要操作的字段名稱,並且該字段是數組字段
$all:操作符,在一個數組中選擇符合條件的文檔
value1-n:查詢條件要滿足的值,可以有多個值,可以滿足一個,兩個,或者多個
$all操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } { "_id" : ObjectId("5adb4b5df82775fbd989b852"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple", "banana", "orange" ] } > //查詢結果 無值 > db.students.find({"frut":["apple","orange"]}) > //查詢結果 增加了$all操作符的,orange是第三個元素 > db.students.find({"frut":{"$all":["apple","orange"]}}) { "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple", "banana", "orange" ] }
17、$size 操作符:該操作符是根據數組字段元素的個數作為查詢條件的,可以理解為查詢數組字段中具有number個元素的文檔
語法:db.collectionName.find({<key>:{$size:number}})
參數說明:
key:要操作的字段名稱,該字段必須是數組字段
$size:操作符,根據數組元素個數來作為查詢條件
number:表示幾個元素,不是第幾個,可以理解為我們查詢數組字段中有number個值的文檔
$size操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } { "_id" : ObjectId("5adb4b5df82775fbd989b852"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple", "banana", "orange" ] } > //查詢結果,查詢只有一個元素的文檔,沒有 > db.students.find({"frut":{"$size":1}}) //查詢結果,查詢只有2個元素的文檔 > db.students.find({"frut":{"$size":2}}) { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb4b5df82775fbd989b852"), "frut" : [ "apple", "banana" ] } //查詢結果,查詢只有3個元素的文檔 > db.students.find({"frut":{"$size":3}}) { "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple", "banana", "orange" ] } >
18、$slice 操作符:該操作符可以從數組字段的頭部或者尾部獲取指定個數的元素的文檔
語法:db.collectionName.find({query},{<key>:{$slice:number}})
參數說明:
key:要操作的字段名稱,該字段必須是數組字段
$slice:操作符,可以從數組的頭部或者尾部取指定數量的元素
number:這個數字表示要獲取的數組字段元素的個數,正負表示從頭部還是從尾部來獲取
$slice操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } { "_id" : ObjectId("5adb4b5df82775fbd989b852"), "frut" : [ "apple", "banana" ] } { "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple", "banana", "orange" ] } //查詢結果,從頭部獲取一個元素的文檔 > db.students.find({},{"frut":{"$slice":1}}) { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "frut" : [ "apple" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "frut" : [ "apple" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } { "_id" : ObjectId("5adb4b5df82775fbd989b852"), "frut" : [ "apple" ] } { "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "apple" ] } //查詢結果,從尾部獲取一個元素的文檔 > db.students.find({},{"frut":{"$slice":-1}}) { "_id" : ObjectId("5adb3dbda62a80dd1239bb40"), "frut" : [ "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb41"), "frut" : [ "banana" ] } { "_id" : ObjectId("5adb3dbda62a80dd1239bb42"), "userName" : "ZhangFei", "sex" : "1", "age" : "33", "address" : "HeBei" } { "_id" : ObjectId("5adb3dbda62a80dd1239bb43"), "userName" : "GuanYu", "sex" : "1", "age" : "26", "address" : "ShanXi" } { "_id" : ObjectId("5adb4b5df82775fbd989b852"), "frut" : [ "banana" ] } { "_id" : ObjectId("5adb4b83f82775fbd989b859"), "frut" : [ "orange" ] }
19、$elemMatch 操作符:該操作符也是針對數組字段來進行的,我們可以針對數組中的元素做判斷,是否滿足某一個條件,滿足就顯示記錄,不滿足就不做操作。
語法:db.collectionName.find({<key>:{$elemMatch:{query}}})
參數說明:
key:要操作的字段名稱,該字段必須是數組字段。
$elemMatch:操作符,對數組字段中的元素做判別,看看是否滿足特定的條件
query:該查詢條件是針對數組字段中元素進行操作的。
$elemMatch操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
示例代碼:
//原始數據 > db.students.find() { "_id" : ObjectId("5adb555ca62a80dd1239bb44"), "userName" : "Bob", "values" : [ 1, 2, 3, 4, 5, 6 ] } { "_id" : ObjectId("5adb5568a62a80dd1239bb45"), "userName" : "Bob", "values" : 1 } { "_id" : ObjectId("5adb556ea62a80dd1239bb46"), "userName" : "Bob", "values" : 2 } { "_id" : ObjectId("5adb5571a62a80dd1239bb47"), "userName" : "Bob", "values" : 3 } { "_id" : ObjectId("5adb5575a62a80dd1239bb48"), "userName" : "Bob", "values" : 4 } { "_id" : ObjectId("5adb5578a62a80dd1239bb49"), "userName" : "Bob", "values" : 5 } { "_id" : ObjectId("5adb557ca62a80dd1239bb4a"), "userName" : "Bob", "values" : 6 } //如果不做限制,數組字段和數字字段都查出來 > db.students.find({"values":{"$gt":1,"$lt":4}}) { "_id" : ObjectId("5adb555ca62a80dd1239bb44"), "userName" : "Bob", "values" : [ 1, 2, 3, 4, 5, 6 ] } { "_id" : ObjectId("5adb556ea62a80dd1239bb46"), "userName" : "Bob", "values" : 2 } { "_id" : ObjectId("5adb5571a62a80dd1239bb47"), "userName" : "Bob", "values" : 3 } //如果我只想針對數組字段操作,可以這樣 > db.students.find({"values":{"$elemMatch":{"$gt":1,"$lt":4}}}) { "_id" : ObjectId("5adb555ca62a80dd1239bb44"), "userName" : "Bob", "values" : [ 1, 2, 3, 4, 5, 6 ] }
20、內嵌文檔的查詢:如果按一般方式,由於字段結構的不同,查詢結果也會有異,如果結構不同,但是內容相同的情況,我們就要使用文檔對象的方式來執行查詢,擺脫了文檔結構的束縛。
語法:<outKey>.<innerKey>
參數說明:
outKey:外部文檔(父文檔)要操作的字段名稱
innerKey:內部文檔(子文檔)要操作的字段名稱
示例代碼:
//原始數據 > db.names.find() { "_id" : ObjectId("5adb5915a62a80dd1239bb4b"), "name" : { "firstName" : "liu", "lastName" : "lei" } } { "_id" : ObjectId("5adb5937a62a80dd1239bb4c"), "name" : { "lastName" : "lei", "firstName" : "liu" } } { "_id" : ObjectId("5adb5944a62a80dd1239bb4d"), "name" : { "firstName" : "zhang", "lastName" : "san" } } { "_id" : ObjectId("5adb5951a62a80dd1239bb4e"), "name" : { "firstName" : "li", "lastName" : "si" } } { "_id" : ObjectId("5adb595ba62a80dd1239bb4f"), "name" : { "firstName" : "wang", "lastName" : "wu" } } //一般查詢:查詢結果,大家看好了,其實第一條和第二條兩個內容是完全一樣的,只是順序不一樣,如果按一般方式查詢,只能獲取一條記錄 > db.names.find({"name":{"firstName":"liu","lastName":"lei"}}) { "_id" : ObjectId("5adb5915a62a80dd1239bb4b"), "name" : { "firstName" : "liu", "lastName" : "lei" } } //文檔對象查詢:查詢結果,大家看好了,其實第一條和第二條兩個內容是完全一樣的,只是順序不一樣,如果按一般方式查詢,只能獲取一條記錄 > db.names.find({"name.firstName":"liu","name.lastName":"lei"}) { "_id" : ObjectId("5adb5915a62a80dd1239bb4b"), "name" : { "firstName" : "liu", "lastName" : "lei" } } { "_id" : ObjectId("5adb5937a62a80dd1239bb4c"), "name" : { "lastName" : "lei", "firstName" : "liu" } }
好了,以上就是新增加進來的,以后學了新的東西在更新吧。主要是上班時間也不是很多,主要是靠周末或者晚上,一些東西很容易時間就飛了,時間控制不好,第二天就沒精神了。
三、總結
今天就寫到這里了,有關查詢和更新的內容還很多,今天只是針對MongoDB的查詢新增了一些操作符和相關語法。由於時間不是很充裕,所以這個進度,有可能就慢了,慢工出細活,也希望自己能更深入肌理,明白一二,如果有了心得我還會繼續更新的。不忘初衷,繼續努力吧。