1、引言
上一篇文章咱們已經介紹了MongoDB數據庫的最基本操做,包括數據庫的建立、使用和刪除數據庫,文檔的操做也涉及到了文檔的建立、刪除、更新和查詢,固然也包括集合的建立、重命名和刪除。有了這些基本操做,你們第一次使用MongoDb數據庫的時候就不會慌張,慢慢操做就能夠了。雖然上一篇文章簡單介紹了一些文檔的查詢,那都是最基本的,因爲文檔的查詢涉及的內容比較多,因此咱們須要單獨寫一篇文章來專門介紹有關文檔的查詢的詳細信息。廢話很少說,立刻開始咱們今天的寫做吧。
2、MongDB查詢的詳解
我比較直接,直接上內容,有關查詢的每一個方法都有示例代碼,應該不是很難。
一、find()查詢方法:根據查詢條件返回符合條件的全部文檔
MongoDB 查詢文檔使用 find() 方法,find() 方法以非結構化的方式來顯示全部文檔。
語法:db.collectionName.find(query, projection)
參數說明:
query :可選,使用查詢操做符指定查詢條件
projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。格式相似{<key>:1,<key>:1,_id:0},0值表示不顯示,其餘值均爲顯示,不管正負值。該參數控制不顯示的字段,須要顯示的不在該參數裏書寫就能夠。
若是你須要以易讀的方式來讀取數據,可使用 pretty() 方法,語法格式以下:
>db.collectionName.find().pretty()
pretty() 方法以格式化的方式來顯示全部文檔。
1.一、示例代碼:查詢全部文檔
shell
//find()方法內沒有任何查詢條件,查詢全部記錄,find({})方法表示空條件,也就是無條件,和find()方法查詢結果同樣。 > db.students.find() { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } > db.students.find({}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
1.二、示例代碼:根據指定條件查詢文檔數據庫
//查詢【name】字段的值是【angShiYu】 的文檔 > db.students.find({name:"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } //查詢【sex】性別字段是【1】男的全部文檔 > db.students.find({sex:1}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } //查詢【sex】性別字段是【1】男的,而且【age】字段的值是【22】的全部文檔 > db.students.find({sex:1,age:22}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } >
1.三、示例代碼:控制字段的顯示 spa
//find({查詢條件},{控制字段顯示與否})方法的第二個參數控制查詢出來的字段的顯示,_id:0,表示不顯示,其餘值均爲顯示,不寫該字段也會顯示,_id主鍵除外的字段,須要顯示就寫上,可是其值不能是0,好比:address:0,這會產生錯誤,address:1/-1都會顯示 //查詢【sex】性別字段是【1】男的全部文檔,_id字段不顯示,只顯示【name】,【age】,【school】字段 > db.students.find({sex:1},{_id:0,name:-1,age:1,school:1}) { "name" : "FangShiYu", "age" : 22, "school" : "ZheJiangDaXue" } { "name" : "HuangFeiHong", "age" : 32, "school" : "GuangDongDaXue" } >
1.四、示例代碼:格式化文檔code
//使用pretty()格式化輸出 > db.students.find({sex:0}).pretty() { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
二、findOne()查詢方法:查詢結果只會返回符合條件的第一條文檔
MongoDB 查詢文檔使用 findOne()方法查詢符合條件的第一條文檔,使用和find()方法相似,並以非結構化的方式來顯示全部文檔。
語法:db.collectionName.findOne(query, projection)
參數說明:
query :可選,使用查詢操做符指定查詢條件
projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。格式相似{<key>:1,<key>:1,_id:0},非0的值表示顯示,0表示不顯示
findOne()方法不支持pretty()方法。
2.一、示例代碼:顯示符合條件的第一條記錄 blog
//性別【sex】是【1】男性的有兩條文檔,可是隻顯示了第一條 > db.students.findOne({sex:1}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
2.二、示例代碼:控制字段列的顯示排序
> db.students.findOne({sex:1},{_id:0,name:1,age:1,sex:1,school:1,address:1}) { "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } >
2.三、示例代碼:findOne()方法不支持pretty()方法索引
> db.students.find({sex:1},{_id:0,name:-1,age:1,school:1}).pretty() 2018-03-29T13:27:12.277+0800 E QUERY [thread1] TypeError: db.students.findOne(...).pretty is not a function : @(shell):1:1
三、條件操做符
若是你熟悉常規的 SQL 數據,經過下表能夠更好的理解 MongoDB 的條件語句查詢:
3.一、: 等於 :查詢指定字段的值等於某個具體的值的時候返回符合條件的文檔
語法:db.collectionName.find({<key>:<value>})
參數說明:
key:須要執行查詢判斷的字段名
value:這個值是一個具體的數值,而且這個值須要和Key字段裏面的值進行比較,只有當Key字段的值等於Value的時候,才返回符合條件的文檔
實例代碼:ip
> db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
3.二、$lt 小於:查詢指定字段的值小於某個具體的值的時候返回符合條件的文檔
語法:db.collectionName.find({<key>:{$lt:<value>}})
參數說明:
key:須要執行查詢判斷的字段名
value:這個值是一個具體的數值,而且這個值須要和Key字段裏面的值進行比較,只有當Key字段的值小於Value的時候,才返回符合條件的文檔
實例代碼:文檔
>db.students.find({"age":{$lt:27}}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
3.三、$lte 小於或等於 :查詢指定字段的值在小於或者等於某個具體的數值時返回全部符合條件的文檔
語法:db.collectionName.find({<key>:{$lte:<value>}})
參數說明:
key:須要執行查詢判斷的字段名
value:這個值是一個具體的數值,而且這個值須要和Key字段裏面的值進行比較,只有當Key字段的值小於或者等於Value的時候,才返回符合條件的文檔
實例代碼:it
> db.students.find({"age":{$lte:27}}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } >
3.四、$gt 大於:查詢指定字段的值是大於某個具體的值的全部文檔
語法:db.collectionName.find({<key>:{$gt:<value>}})
參數說明:
key:須要執行查詢判斷的字段名
value:這個值是一個具體的數值,而且這個值須要和Key字段裏面的值進行比較,只有當Key字段的值大於Value的時候,才返回符合條件的文檔
實例代碼:
> db.students.find({"age":{$gt:27}}) { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } >
3.五、$gte 大於或等於 :查詢指定字段的值是大於或者等於某個值的全部文檔
語法:db.collectionName.find({<key>:{$gte:<value>}})
參數說明:
key:須要執行查詢判斷的字段名
value:這個值是一個具體的數值,而且這個值須要和Key字段裏面的值進行比較,只有當Key字段的值比Value大或者相等,並返回符合條件的文檔
實例代碼:
> db.students.find({"age":{$gte:24}}) { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } >
3.六、$ne 不等於:查詢指定字段的值不等於某個特定值並返回符合條件的文檔
語法:db.collectionName.find({<key>:{$ne:<value>}})
參數說明:
key:須要執行查詢的字段名
value:這個值是一個具體的數值,而且這個值須要和Key字段裏面的值進行比較,不相等,就執行查詢,並返回符合條件的記錄
實例代碼:
> db.students.find({"sex":{$ne:1}}) { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
3.七、$gte 和 $lte 大於等於、小於等於:查詢指定字段的值屬於某個指定值的範圍的全部文檔,知足條件返回文檔
語法:db.collectionName.find({<key>:{$gte:<value1>,$lte:<value2>}})
參數說明:
key:進行比較的字段名
$gte:大於等於
value1:這個值是要大於等於的那個值
$lte:小於等於
value2:這個值是要小於等於的那個值
value1和value2造成一個比較的範圍,能夠針對名稱爲Key的字段的值進行判斷
實例代碼:
> db.students.find({"age":{$gte:20,$lte:27}}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } >
四、And和Or 的使用
4.一、and 的使用:和的關係,必須知足全部的條件才能完成查詢
語法:db.collectionName.find({query1,query2,query3,...queryn})
參數說明:
query1-n:查詢條件,這些查詢條件必須在一個花括號({})裏面,這種使用方式纔是and的關係
示例代碼:
>db.students.find({age:{$gt:24},sex:0}) { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } >
4.二、or 的使用:或的關係,知足條件之一就能夠完成查詢
語法:db.collectionName.find({$or:[{query1},{query2},{query3},...{queryn}]})
參數說明:
query1-n:是查詢條件,條件之間是或(or)的關係,而且「[]」方括號不能省略
示例代碼:
>db.students.find({$or:[{sex:0},{age:22}]}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } >
4.三、and 和 or
語法:db.collectionName.find({query1,query2,query3,...,$or:[{query4},{query5},{query6},...]]})
參數說明:
query1-n:都是查詢的條件,前面的查詢條件和後面的查詢條件是or的關係,「$or」前面部分的查詢條件是and的關係,後面的是or的關係
示例代碼:
> db.students.find({age:{$gt:24},sex:0,$or:[{sex:1},{age:27}]}) { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } >
五、以ID做爲查詢條件
語法:db.collectionName.find({_id:ObjectId("id的值")})
參數說明:
_id:Mongodb自動生成的主鍵,這個是固定寫法,不能改變。
ObjectId:表明是主鍵_id的值,整個的寫法是:ObjectId("5ab9de223afa6504457050e2"),這個方法的值纔是_id主鍵的值,其餘寫法是錯誤
代碼實例:
> db.students.find({_id:ObjectId("5ab9de223afa6504457050e2")}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } >
六、count()方法:統計查詢文檔記錄的條數
語法:db.collectionName.find({query1,query2...queryn}).count()
參數說明:
query1-n:查詢條件,能夠有多個查詢條件,多個查詢條件之間是and的關係。
代碼實例:
> db.students.find({"sex":1}).count() 2 >
七、查詢以什麼值開頭
語法:db.collectionName.find({<key>:/^value/})
參數說明:
key:要查詢的字段的名稱
value:檢查key字段的值中是否以value開始,格式:/^value/,斜槓「/」和「^」不能省略
代碼實例:
> db.students.find({name:/^F/}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
八、查詢某個字段老是否包含另外一個值
語法:db.collectionName.find({<key>:/value/})
參數說明:
key:查詢的字段的名稱
value:查詢key字段的值中是否包含着value的值,先後的兩個斜槓「/」不能省略
代碼實例:
> db.students.find({name:/ng/}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" }
九、limit()和skip()方法的使用
9.一、limit()方法:只顯示num條
語法:db.collectionName.find({query}).limit(num)
參數說明:
query:查詢條件
num:條數,僅僅顯示的條數
示例代碼:
//顯示前2條 >db.students.find().limit(2) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
9.二、skip()方法:跳過num條後繼續顯示
語法:db.collectionName.find({query}).skip(num)
參數說明:
query:查詢條件
num:跳過的條數
示例代碼:
//跳過2條,從第3條開始顯示 >db.students.find().skip(2) { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } >
9.三、skip()和 limit() 聯合使用:分頁顯示
語法:db.collectionName.find({query}).skip(pageIndex*pageSize).limit(pageSize)
參數說明:
query:查詢條件
pageIndex:頁碼索引,從0開始
pageSize:每頁顯示的條數
示例代碼:
//跳過1條,從第2條開始顯示2條 > db.students.find().skip(1).limit(2) { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } >
十、sort()方法:針對某個字段進行升序或者降序排序
語法:db.collectionName.find({query}).sort({<key>:1升序|-1 降序})
參數說明:
query:查詢條件
key:針對排序的字段名,1爲升序,-1爲降序,不能爲其餘值
示例代碼:
//按年齡(age)升序排列 > db.students.find().sort({age:1}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } //按年齡(age)降序排列 > db.students.find().sort({age:-1}) { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
十一、$type 操做符:能夠針對某個字段查詢該字段的值和具體數據類型相匹配的文檔
語法:db.collectionName.find({<key>:{$type:<value>}})
參數說明:
key:要操做的字段名稱
value:表示類型對應的值
$type操做符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
MongoDB 中可使用的類型以下表所示:
類型 數字 備註
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已廢棄。
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127
示例代碼:
//若是想獲取 "school" 集合中 name 爲 String 的數據,你可使用如下命令: > db.students.find({"name":{$type:2}}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" } { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" } { "_id" : ObjectId("5ab9de3c3afa6504457050e4"), "name" : "HuangFeiHong", "age" : 32, "sex" : 1, "school" : "GuangDongDaXue", "address" : "GuangDongFoShan" } >
3、總結 今天就寫到這裏了,有關查詢和更新的內容還不少,今天只是介紹一個大概的內容,讓你們對MongoDB的操做有一個初步的印象。咱們之後會用更多的章節介紹查詢和跟新的內容,包括條件操做符,修改操做符,還有一些特殊的操做符,正由於這部分的內容不少,因此須要咱們使用單獨的章節來介紹其內容。不忘初衷,繼續努力吧。