天天看點

三、mongdb 查詢一、 MongoDB文檔檢索二、MongoDB聚合架構

一、 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