1.基本查詢
①方法find():查詢
db.集合名稱.find({條件文檔})
②方法findOne():查詢,只返回第一個
db.集合名稱.findOne({條件文檔})
③方法pretty():將結果格式化
db.集合名稱.find({條件文檔}).pretty()
2.比較運算符
# 等於,默認是等於判斷,沒有運算符
# 小於,$lt less-than
# 小於或等於,$lte less-than,equal
# 大於,$gt greater-than
# 小於或等於,$gte greater-than,equal
# 不等於,$ne not equal
db.collection2.find({name:'郭靖'})
db.collection2.find({age:{$gte:18}})
3.邏輯運算符
①邏輯與
# 默認是邏輯與的關系
# 例:查詢年齡大於或等於18,並且性別為true的學生
db.collection2.find({age:{$gte:18}, gender:true})
②邏輯或
# 使用$or,值為數組,數組中每個元素為json
# 例:查詢年齡大於18,或性別為false的學生
db.collection2.find({$or:[{age:{$gt:18}},{gender:false}]})
注意點:find() >> 或條件下的{} >> $or[ ] >>
>> {條件a},{條件b} >> {域:{ 邏輯符判斷} }
③或、與共用
# 例:查詢年齡大於18或姓名是郭靖,並且性別為男生
db.collection2.find( {$or:[ {age:{$gt:18} },{name:'郭靖'} ],gender:true} )
4.范圍運算符
# $in|$nin
# 例:查詢年齡為18,28的學生
db.collection2.find( {age:{$in:[18, 28] } } )
# 這里要注意了,最大與最小都需要表中含有這幾個數
5.支持正則表達式
# 使用 // 或 $regex 編寫正則表達式
# 例:db.collection2.find( {name:/^黃/} )
db.collection2.find( {name:{$regex:'^黃'} } )
6.自定義查詢
# 使用$where后面寫一個函數,返回滿足條件的數據
# 例:查詢大於30歲的學生
db.collection2.find(
{
$where: function(){
return this.age > 18
}})
7.Limit和Skip
①方法limit():讀取指定數量的文檔
# db.集合名稱.find().limit(NUMBER)
db.collection2.find().limit(2)
# 附:如果指定參數則顯示集合中的所有文檔
②方法skip():用於跳過指定數量的文檔
# db.集合名稱.find().skip(NUMBER)
db.stu.find().skip(2)
# 附:參數NUMBER表示跳過的記錄條數,默認為0
③limit()與skip()一起使用
# 不分先后順序;跳過指定數量文檔,再讀取指定數量的文檔
# 查詢數據
db.collection1.find().limit(4).skip(5)
db.collection1.find().skip(5).limit(4)
8.投影
--選擇字段顯示數據
# ①db.集合名稱.find({},{ 字段名稱:1, ...})
db.collection2.find({},{name:1, gender:1})
# '1':表示顯示字段,不設置表示不顯示
# ②特殊:對於_id列默認是顯示的,
# 如果不顯示需要明確設置為0
db.collection2.find({},{_id:0,name:1,gender:1})
9.排序
--對結果集進行排序
參數1為升序排列
參數-1位降序排列
# db.集合名稱.find().sort({字段:1....})
# --根據性別降序,再根據年齡升序
db.collection2.find().sort({gender:-1,age:1})
10.統計個數
①方法count():用於統計結果集中文檔條數
1.db.集合名稱.find({條件}).count()
db.collection2.find({gender:true}).count()
# --統計男生人數
2.db.集合名稱.count({條件})
db.collection2.count({age:{$gt:20}, gender:true})
# --統計年齡大於20的男生人數
11.消除重復
①方法distinct():對字段數據進行去重,提取
--db.集合名稱.distinct('去重字段',{條件})
db.collection2.distinct('hometown',{age:{$gt:18}})
# 查詢年齡大於18歲的學生,來自哪些省份
# 4.聚合查詢
1.基本語法
--語法
db.集合名稱.aggregate( {管道: {表達式} } )
附:
1.管道:在Unix和Linux中一般用於將當前命令的
輸出結果作為下一個命令的輸入
2.表達式:處理輸入文檔並輸出
2.常用表達式
$sum: 計算綜合,$sum:1 表示以一倍計數
$avg: 計算平均值
$min: 獲取最小值
$max: 獲取最大值
$push: 在結果文檔中插入值到第一個文檔數據
$first: 根據資源文檔的排序獲取第一個文檔數據
$last: 根據資源文檔的排序獲取最后一個文檔數據
3.常用管道
①$group
--將集合中的文檔分組,可用於統計結果
--_id表示分組的依據,使用某個字段的格式為'$字段'
# 統計男生、女生的總人數
db.stu.aggregate(
{$group:
{
_id:'$gender',
counter:{$sum:1}
}
}
)
--透視數據
# 統計學生性別及學生姓名
db.stu.aggregate(
{$group:
{
_id:'$gender',
name:{$push:'$name'}
}
}
)
--使用$$ROOT可以將文檔內容加入到結果集的數組中
db.stu.aggregate(
{$group:
{
_id:'$gender',
name:{$push:'$$ROOT'}
}
}
)
②$match
--修改輸入文檔的結構,如重命名、增加、刪除字段、創建計算結果
--用於過濾數據,只輸出符合條件的文檔
--使用MongoDB的標准查詢操作
# 查詢年齡大於20的學生
db.stu.aggregate(
{$match:{age:{$gt:20}}}
)
# 查詢年齡大於20的男生、女生人數
db.stu.aggregate(
{$match:{age:{$gt:20}}},
{$group:{_id:'$gender',counter:{$sum:1}}}
)
③$project
--修改輸入文檔的結構,
如重命名、增加、刪除字段、創建計算結果
# 查詢學生的姓名、年齡
db.stu.aggregate(
{$project:{_id:0,name:1,age:1}}
)
# 查詢男生、女生人數,輸出人數
db.stu.aggregate(
{$group:{_id:'$gender',counter:{$sum:1}}},
{$project:{_id:0,counter:1}}
)
④$sort
--將輸入文檔排序后輸出
# 查詢學生信息,按年齡升序
b.stu.aggregate({$sort:{age:1}})
# 查詢男生、女生人數,按人數降序
db.stu.aggregate(
{$group:{_id:'$gender',counter:{$sum:1}}},
{$sort:{counter:-1}}
)
⑤$limit和$skip
--$limit
# 限制聚合管道返回的文檔數
# 查詢2條學生信息
db.stu.aggregate({$limit:2})
--$skip
# 跳過指定數量的文檔,並返回余下的文檔
# 查詢從第3條開始的學生信息
db.stu.aggregate({$skip:2})
# 統計男生,女生人數,按人數升序,取第2條數據
db.stu.aggregate(
{$group:{_id:'$gender', counter:{$sum:1}}}
{$sort:{counter:1}}
{$skip:1}
{$limit:1}
)
⑥$unwind字段拆分查詢
--語法
--文檔中一個數組字段含有多個值
--根據字段下的值拆分多條
--每條包含數組中的一個值
--db.集合名稱.aggregate({$unwind:'$字段名稱'})
# $unwind聚合方法下含有兩個屬性:
path:'$字段名稱'
preserveNullAndEmptyArrays:<布爾值>
# 不填寫屬性,默認表示<布爾值>為false
# 且不用標記屬性名
--構造數據
db.t3.insert([
{ "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "b", "size" : [ ] },
{ "_id" : 3, "item" : "c", "size": "M" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])
--查看查詢結果,顯示對空數組,無字段,null的文檔
db.t3.aggregate( { $unwind:{ path:'$size', preserveNullAndEmptArrays:true}})
--查看查詢結果,不顯示空數組,無字段,null的文檔
db.t3.aggregate({$unwind: '$size'}) 相當於:
db.t3.aggregate({$unwind:{path:'$size', preserveNullAndEmptyArrays:false}})