摘要:上篇文章中我們已經學習了中幾個基本的管道操作符,本文我們再來看看其他的管道操作符。算術操作符通過算術操作符我們可以對分組后的文檔進行求和或者求平均數。好了,中的管道操作符我們就先說到這里,小伙伴們有問題歡迎留言討論。
上篇文章中我們已經學習了MongoDB中幾個基本的管道操作符,本文我們再來看看其他的管道操作符。
本文是MongoDB系列的第十三篇文章,了解前面的文章有助于更好的理解本文:
1.Linux上安裝MongoDB
2.MongoDB基本操作
3.MongoDB數據類型
4.MongoDB文檔更新操作
5.MongoDB文檔查詢操作(一)
6.MongoDB文檔查詢操作(二)
7.MongoDB文檔查詢操作(三)
8.MongoDB查看執行計劃
9.初識MongoDB中的索引
10.MongoDB中各種類型的索引
11.MongoDB固定集合
12.MongoDB管道操作符(一)
$group可以用來對文檔進行分組,比如我想將訂單按照城市進行分組,并統計出每個城市的訂單數量:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",count:{$sum:1}}})
我們將要分組的字段傳遞給$group函數的_id字段,然后每當查到一個,就給count加1,這樣就可以統計出每個城市的訂單數量。
算術操作符通過算術操作符我們可以對分組后的文檔進行求和或者求平均數。比如我想計算每個城市訂單運費總和,如下:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",totalFreight:{$sum:"$freight"}}})
先按地址分組,再求和。這里貼出部分查詢結果,如下:
{ "_id" : "HaiKou", "totalFreight" : 20.0 } { "_id" : "HangZhou", "totalFreight" : 10.0 }
也可以計算每個城市運費的平均數,如下:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",avgFreight:{$avg:"$freight"}}})
先按地址分組,然后再計算平均數。
極值操作符極值操作符用來獲取分組后數據集的邊緣值,比如獲取每個城市最貴的運費,如下:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",maxFreight:{$max:"$freight"}}})
查詢每個城市最便宜的運費:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",minFreight:{$min:"$freight"}}})
按城市分組之后,獲取該城市第一個運費單:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",firstFreight:{$first:"$freight"}}})
獲取分組后的最后一個運費單:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",lastFreight:{$last:"$freight"}}})數據操作符
$addToSet可以將分組后的某一個字段放到一個數組中,但是重復的元素將只出現一次,而且元素加入到數組中的順序是無規律的,比如將分組后的每個城市的運費放到一個數組中,如下:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",freights:{$addToSet:"$freight"}}})
重復的freight將不會被添加進來。
$push則對重復的數據不做限制,都可以添加進來,如下:
db.sang_collect.aggregate({$group:{_id:"$orderAddressL",freights:{$push:"$freight"}}})$unwind
$unwind用來實現對文檔的拆分,可以將文檔中的值拆分為多帶帶的文檔,比如我的數據如下:
{ "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"), "name" : "魯迅", "books" : [ { "name" : "吶喊", "publisher" : "花城出版社" }, { "name" : "彷徨", "publisher" : "南海出版出" } ] }
使用$unwind命令將其拆分為獨立文檔,如下:
db.sang_books.aggregate({$unwind:"$books"})
拆分結果如下:
{ "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"), "name" : "魯迅", "books" : { "name" : "吶喊", "publisher" : "花城出版社" } } { "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"), "name" : "魯迅", "books" : { "name" : "彷徨", "publisher" : "南海出版出" } }其他操作符
$sort操作可以對文檔進行排序,如下:
db.sang_collect.aggregate({$sort:{orderAddressL:1}})
用法和我們之前介紹普通搜索中的一致,可以按照存在的字段排序,也可以按照重命名的字段排序,如下:
db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$sort:{oa:-1}})
1表示升序、-1表示降序。
$limit返回結果中的前n個文檔,如下表示返回結果中的前三個文檔:
db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$limit:3})
$skip表示跳過前n個文檔,比如跳過前5個文檔,如下:
db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$skip:5})
$skip的效率低,要慎用。
總結在管道開始執行的階段盡可能過濾掉足夠多的數據,這樣做有兩個好處:1.只有從集合中直接查詢時才會使用索引,盡早執行過濾可以讓索引發揮作用;2.該過濾的數據過濾掉之后,也可以降低后面管道的執行壓力。另外,MongoDB不允許一個聚合操作占用過多的內存,如果有一個聚合操作占用了超過20%的內存,則會直接報錯。
好了,MongoDB中的管道操作符我們就先說到這里,小伙伴們有問題歡迎留言討論。
參考資料:
1.《MongoDB權威指南第2版》
更多資料請關注公眾號:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19154.html
摘要:累加器累加器本來只能使用與下,但是版本或以上,部分累加器還能使用于。當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用。 回顧 相關文章回顧 mongoDB查詢進階--聚合管道(一)回顧mongoDB查詢進階--聚合管道(二)回顧mongoDB查詢進階--聚合管道(三)回顧 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Oper...
摘要:累加器累加器本來只能使用與下,但是版本或以上,部分累加器還能使用于。當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用。 回顧 相關文章回顧 mongoDB查詢進階--聚合管道(一)回顧mongoDB查詢進階--聚合管道(二)回顧mongoDB查詢進階--聚合管道(三)回顧 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Oper...
摘要:當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用,具體用法下一篇文章闡述。另外再加以配合表達式操作符組成的表達式或者在或中使用累加器能查詢統計的內容會更加的多樣化。 上篇最后說到管道操作符,本篇文章將詳細說一下管道操作符。 mongoDB查詢進階--聚合管道(一)回顧 什么是管道操作符(Aggregation Pipeline Operators) ...
摘要:當在中使用時,累加器是針對每個分組使用的當在中使用時,累加器則是針對每個字面量起作用,具體用法下一篇文章闡述。另外再加以配合表達式操作符組成的表達式或者在或中使用累加器能查詢統計的內容會更加的多樣化。 上篇最后說到管道操作符,本篇文章將詳細說一下管道操作符。 mongoDB查詢進階--聚合管道(一)回顧 什么是管道操作符(Aggregation Pipeline Operators) ...
摘要:實例教程是一個數據庫搜云庫教程專注于開發技術的研究與知識分享方法中你也可以設置使用多個字段創建索引關系型數據庫中稱作復合索引。 上一篇文章練習了,MongoDB 的以下操作 安裝 MongoDB 服務 連接 MongoDB MongoDB 創建數據庫 MongoDB 刪除數據庫 MongoDB 插入文檔 MongoDB 刪除文檔 MongoDB 查詢文檔 MongoDB AND 條件...
閱讀 2183·2021-11-19 09:40
閱讀 1919·2021-11-08 13:24
閱讀 2453·2021-10-18 13:24
閱讀 2858·2021-10-11 10:57
閱讀 3578·2021-09-22 15:42
閱讀 1114·2019-08-29 17:11
閱讀 2528·2019-08-29 16:11
閱讀 2421·2019-08-29 11:11