一、引言
上一篇文章我們已經介紹了MongoDB數據庫的最基本操作,包括數據庫的創建、使用和刪除數據庫,文檔的操作也涉及到了文檔的創建、刪除、更新和查詢,當然也包括集合的創建、重命名和刪除。有了這些基本操作,大家第一次使用MongoDb數據庫的時候就不會慌張,慢慢操作就可以了。雖然上一篇文章簡單介紹了一些文檔的查詢,那都是最基本的,由於文檔的查詢涉及的內容比較多,所以我們需要單獨寫一篇文章來專門介紹有關文檔的查詢的詳細信息。廢話不多說,馬上開始我們今天的寫作吧。
二、MongDB查詢的詳解
我比較直接,直接上內容,有關查詢的每個方法都有示例代碼,應該不是很難。
1、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.1、示例代碼:查詢所有文檔
//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.2、示例代碼:根據指定條件查詢文檔
//查詢【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.3、示例代碼:控制字段的顯示
//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.4、示例代碼:格式化文檔
//使用pretty()格式化輸出 > db.students.find({sex:0}).pretty() { "_id" : ObjectId("5ab9de223afa6504457050e3"), "name" : "YanYongChun", "age" : 27, "sex" : 0, "school" : "FuJianDaXue", "address" : "FuJianNanTianRen" }
2、findOne()查詢方法:查詢結果只會返回符合條件的第一條文檔
MongoDB 查詢文檔使用 findOne()方法查詢符合條件的第一條文檔,使用和find()方法類似,並以非結構化的方式來顯示所有文檔。
語法:db.collectionName.findOne(query, projection)
參數說明:
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。格式類似{<key>:1,<key>:1,_id:0},非0的值表示顯示,0表示不顯示
findOne()方法不支持pretty()方法。
2.1、示例代碼:顯示符合條件的第一條記錄
//性別【sex】是【1】男性的有兩條文檔,但是只顯示了第一條 > db.students.findOne({sex:1}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
2.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.3、示例代碼: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
3、條件操作符
如果你熟悉常規的 SQL 數據,通過下表可以更好的理解 MongoDB 的條件語句查詢:
3.1、: 等於 :查詢指定字段的值等於某個具體的值的時候返回符合條件的文檔
語法:db.collectionName.find({<key>:<value>})
參數說明:
key:需要執行查詢判斷的字段名
value:這個值是一個具體的數值,並且這個值需要和Key字段里面的值進行比較,只有當Key字段的值等於Value的時候,才返回符合條件的文檔
實例代碼:
> db.students.find({"name":"FangShiYu"}) { "_id" : ObjectId("5ab9de223afa6504457050e2"), "name" : "FangShiYu", "age" : 22, "sex" : 1, "school" : "ZheJiangDaXue", "address" : "GuangDongGuangZhou" }
3.2、$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.3、$lte 小於或等於 :查詢指定字段的值在小於或者等於某個具體的數值時返回所有符合條件的文檔
語法:db.collectionName.find({<key>:{$lte:<value>}})
參數說明:
key:需要執行查詢判斷的字段名
value:這個值是一個具體的數值,並且這個值需要和Key字段里面的值進行比較,只有當Key字段的值小於或者等於Value的時候,才返回符合條件的文檔
實例代碼:
> 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.4、$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.5、$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.6、$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.7、$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" } >
4、And和Or 的使用
4.1、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.2、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.3、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" } >
5、以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" } >
6、count()方法:統計查詢文檔記錄的條數
語法:db.collectionName.find({query1,query2...queryn}).count()
參數說明:
query1-n:查詢條件,可以有多個查詢條件,多個查詢條件之間是and的關系。
代碼實例:
> db.students.find({"sex":1}).count() 2 >
7、查詢以什么值開頭
語法: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" }
8、查詢某個字段總是否包含另一個值
語法: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" }
9、limit()和skip()方法的使用
9.1、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.2、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.3、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" } >
10、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" }
11、$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" } >
三、總結
今天就寫到這里了,有關查詢和更新的內容還很多,今天只是介紹一個大概的內容,讓大家對MongoDB的操作有一個初步的印象。我們以后會用更多的章節介紹查詢和跟新的內容,包括條件操作符,修改操作符,還有一些特殊的操作符,正因為這部分的內容很多,所以需要我們使用單獨的章節來介紹其內容。不忘初衷,繼續努力吧。