MongoDB 如何實現巢狀子文件分組
MongoDB 巢狀結構的資料非常常見, 它透過巢狀子文件,達到一對多的關聯關係。但巢狀結構中按分類分組求子文件的資料計算,不能直接透過 $group 聚集運算來實現,需要將巢狀結構解開,由多層巢狀結構變成多條單層結構來計算,由於中間過程的處理,且還要借且其它函式輔助實現輸出。下面以集合 order 為例說明,按 category 分組獲取 term 的數量並按由大到小的順序輸出。
[
{ category: "movies",
terms: [{ term: "movie 1", total: 1000}, {term: "movie 2", total: 100} ]
},
{ category: "sports",
terms: [{ term: "football 1", total: 1000}, {term: "tennis 2", total: 120} ]
},
{ category: "movies",
terms: [{ term: "movie 1", total: 5000}, {term: "movie 2", total: 200},
{term: "movie 3", total: 280} ]
},
{ category: "sports",
terms: [{ term: "football 1", total: 4000}, {term: "tennis 2", total: 250},
{term: "tennis 2", total: 450} ]
},
]
MongoDB透過聚集運算 aggregate,group 實現如下:
db.order.aggregate([
{$unwind : "$terms"},
{ $group : { _id : {
category: "$category",
term: "$terms.term" },
total: {$sum : "$terms.total"}
}
},
{$sort : { total : -1} },
{ $project: {
_id: 0,
category: "$_id.category",
term: "$_id.term",
total:1}}
])
$unwind將 terms陣列拆分成多條, 再由 $group 分組、求和、排序後,最後用 $project過濾欄位輸出。
如果有集算器協助 MongoDB,就不需要這麼繁瑣的組合運算:
|
A |
1 | =mongo_open("mongodb://127.0.0.1:27017/raqdb") |
2 | =mongo_shell(A1,"order.find()").fetch() |
3 | =A2.conj(terms.derive(A2.category)) |
4 | =A5.group(category,term;~.sum(total):total).sort(-total) |
5 | >A1.close() |
集算器 SPL 不僅對解決巢狀分組,對 MongoDB 很多困難的計算都有幫助,可以參考《
》。
SPL 也能很方便地嵌入到 JAVA 應用,可參考
具體使用方法可參考 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2698567/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- nginx 如何實現 if 巢狀Nginx巢狀
- 巢狀子查詢巢狀
- Android實現雙層ViewPager巢狀AndroidViewpager巢狀
- 三種UIScrollView巢狀實現方案UIView巢狀
- 巢狀滾動效果實現討論巢狀
- Laravel 之巢狀事務 transactions 實現Laravel巢狀
- Android實現RecyclerView巢狀流式佈局AndroidView巢狀
- Mysql 巢狀查詢100例子MySql巢狀
- mongodb分組統計MongoDB
- Python中如何避免字典和元組的多重巢狀的方法Python巢狀
- 如何將三元組轉化為巢狀字典型別?巢狀型別
- 多層巢狀後的 Fragment 懶載入實現巢狀Fragment
- Go Error 巢狀到底是怎麼實現的?GoError巢狀
- Laravel Baum 巢狀集合模型中文文件翻譯-部分Laravel巢狀模型
- iOS開發·runtime+KVC實現多層字典模型轉換(多層資料:模型巢狀模型,模型巢狀陣列,陣列巢狀模型)iOS模型巢狀陣列
- Confluence 6 啟用巢狀使用者組巢狀
- Mysql中的巢狀子查詢問題QSBSMySql巢狀
- Go巢狀併發實現EDM,附坑點分析#1Go巢狀
- C++容器巢狀實現動態二維陣列C++巢狀陣列
- mongodb c driver bson的巢狀訪問與層次結構MongoDB巢狀
- Elasticsearch聚合的巢狀桶如何排序Elasticsearch巢狀排序
- MySQL實現分組排序MySql排序
- Shell程式設計-11-子Shell和Shell巢狀程式設計巢狀
- vue元件巢狀之 - 父元件向子元件傳值Vue元件巢狀
- MONGODB03 - 分組計數/分組去重計數(基於 spring-data-mongodb)MongoDBSpring
- 微信小程式自定義tab,多層tab巢狀實現微信小程式巢狀
- 【react】實現動態表單中巢狀動態表單React巢狀
- 線上直播系統原始碼,flutter 巢狀滑動實現原始碼Flutter巢狀
- es中如何使用巢狀物件查詢巢狀物件
- 遞迴元件組合拳,無懼頁面巢狀遞迴元件巢狀
- 三級 NestedScroll 巢狀滾動實踐巢狀
- 列表巢狀操作巢狀
- vue路由巢狀Vue路由巢狀
- 例2.4 使用列表推導式實現巢狀列表的平鋪巢狀
- MySQL——優化巢狀查詢和分頁查詢MySql優化巢狀
- 樸素貝葉斯實現文件分類
- springMVC:校驗框架:多規則校驗,巢狀校驗,分組校驗;ssm整合技術SpringMVC框架巢狀SSM
- mongodb核心原始碼實現及效能優化系列:Mongodb write寫(增、刪、改)模組原始碼實現MongoDB原始碼優化