一、 MongoDB文檔檢索
MongoDB中有多種方式可以檢索文檔:
1.1 查詢過濾器
使用查詢過濾器從集合中檢索文檔。查詢過濾器是一組鍵值對,可按字段值查詢文檔。
例如:
這個示例查詢status等于“A”的文檔。
1.2 範圍查詢操作符
範圍查詢操作符可用于建構基于值範圍的查詢過濾器。例如:
- l t 、 lt、 lt、lte、 g t 、 gt、 gt、gte:分别表示less than、less than or equal、greater than、greater than or equal。
- $in:比對數組中任一值
- $nin:比對不在數組中的任何值
例如:
這個示例查詢age在20到30之間的文檔。
1.3 正規表達式
可以使用正規表達式查詢字元串字段的值。使用$regex操作符指定正規表達式。
例如:
這個示例查詢以A開頭的name字段的文檔。
1.4 投影操作
可以使用投影操作從文檔中選擇需要的字段。使用$project操作指定要包含/排除的字段。
例如:
這個示例查詢所有文檔,但隻傳回name和address字段。_id字段預設傳回,需要顯式排除。
1.5 排序
可以使用$sort操作對結果進行排序。
例如:
這個示例查詢所有文檔,并按age字段升序排列結果。
1.6 限制結果數量
可以使用$limit操作限制結果數量。例如:
這個示例查詢最多5個文檔。
1.7 跳過結果數量
可以使用$skip操作跳過結果數量。例如:
這個示例跳過前10個結果,然後傳回接下來的5個結果。
1.8 索引
可以在字段上建立索引以加快查詢速度。確定索引字段是你查詢過濾器和排序操作中使用的字段。
例如,如果經常按age字段查詢文檔,那麼在age字段上建立索引将大大提高查詢性能。
索引可在建立集合時指定,也可随時添加/删除。
例如,建立age索引:
1.9 文本索引
可以在字元串字段上建立文本索引,以便執行文本搜尋查詢。
例如,如果有一個内容字段包含文章文本,則可以在該字段上建立文本索引,然後執行基于關鍵字的搜尋查詢。
例如,建立内容文本索引:
然後可以執行文本搜尋:
這個示例找到包含“mongodb 文檔檢索”的内容字段的文檔。
1.10 地理空間索引
可以在包含GeoJSON對象的字段上建立2dsphere索引,以執行地理空間操作(例如查詢附近的點)。
例如,如果有一個位置字段包含點的經度和緯度,可以在該字段上建立2dsphere索引:
db.places.createIndex({“位置”: “2dsphere”})
然後可以執行地理空間查詢,如查詢某點附近100千米内的文檔:
db.places.find({
"位置": {
"$near": {
"$geometry": {
"type": "Point",
"coordinates": [x, y]
},
"$maxDistance": 100000
}
}
})
這個示例找到位置字段中點距離(x,y)100千米内的文檔。
1.11 執行查詢
可以通過以下方式執行MongoDB查詢:
- db.col.find()
- db.col.findOne() //查詢一個文檔
- db.col.find().limit(n) //限制n個結果
- db.col.find().skip(n) //跳過前n個結果
- db.col.find().sort({…}) //排序結果
- db.col.findOne({ … }, { field: 1 }) //隻傳回指定字段
- db.col.count({ … }) //統計結果數量
- db.col.distinct(field) //擷取指定字段的不同值
可以使用pretty()方法以易讀的方式檢視查詢結果。
例如:
在MongoDB Compass中也可以視覺化執行查詢、檢視查詢執行計劃和索引使用情況。
二、MongoDB聚合架構
MongoDB的聚合架構提供了管道操作,用于處理資料記錄并傳回計算結果。
聚合管道是把多個操作符連結在一起的過程。每個操作符會接收輸入文檔,對其進行轉換處理,然後輸出。
下面是一些常用的聚合操作符:
2.1 聚合架構
MongoDB的聚合架構提供了管道操作,可用于執行複雜的聚合查詢。
例如,以下聚合管道查詢擷取age字段平均值大于$avg的文檔數量:
db.col.aggregate([
{"$group": {"_id": "null", "avgAge": {"$avg": "$age"}}},
{"$addFields": {"age": "$age"}},
{"$match": {"age": {"$gt": "$avgAge"}}}
])
這個示例使用 g r o u p 階段計算 a g e 平均值 , 然後 group階段計算age平均值,然後 group階段計算age平均值,然後addFields重新添加age字段,最後$match過濾age大于平均值的文檔。
2.2 $group
将集合中的文檔分組,可用于統計結果。
例如,按性别分組并計數:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
])
這個示例會給出gender字段為male和female的文檔數量。
2.3 $match
在聚合管道中過濾資料。與db.col.find()類似,但在聚合操作符中使用。
例如,隻聚合年齡大于30的使用者:
db.users.aggregate([
{"$match": {"age": {"$gt": 30}}},
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
])
2.4 $sort
在管道中對結果進行排序。
例如,按count降序排序結果:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$sort": {"count": -1}}
])
2.5 l i m i t 和 limit和 limit和skip
在管道中限制和跳過結果數量。
例如,跳過前5個結果,然後傳回5個結果:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$sort": {"count": -1}},
{"$skip": 5},
{"$limit": 5}
])
2.6 $unwind
将數組類型字段拆分為單獨的文檔。
例如,如果有一個posts數組字段,每個文檔包含使用者發表的多篇文章,可以使用$unwind操作将posts拆分為單獨的文章文檔:
db.users.aggregate([
{"$unwind": "$posts"}
])
2.7 $project
用于修改輸入文檔的結構。可以用來重命名、增加或删除字段。
例如,删除_id字段,重命名count為數量:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$project": {"_id": 0, "數量": "$count"}}
])
2.8 $addFields
用于向文檔添加新字段。
例如,将count字段增加100,然後重命名為total:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$addFields": {"total": {"$add": ["$count", 100]}}},
{"$project": {"_id": 0, "total": 1}}
])
2.9 執行聚合查詢
可以通過db.col.aggregate()執行聚合查詢。
例如:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
])
可以使用pretty()方法以易讀的方式檢視聚合查詢結果。
例如:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
]).pretty()
這裡包含了比較常用的mongodb的操作了,其餘的可以看官方文檔或者私聊我本人進行補充。
上一章: 二、MongoDB簡介及基本操作
下一章: 四、Springboot連接配接mongodb