Ruby操作MongoDB(進階八)-聚合操作Aggregation
上篇博文講述了排序規則collations的操作和設定方式。順帶介紹了一部分聚合aggregation的設定方式。本文繼續介紹聚合操作。
聚合框架的操作處理完資料記錄後在返回計算結果。集合操作將來源於多個文件的值歸類到一起,這樣就可疑在被歸類的資料上進行多種操作,然後返回一個單獨的結果
1 聚合管道
聚合管道是用於資料聚合的一個框架,是以資料處理管道概念為原型。將文件輸入一個多級管道後,可疑將文件轉換為聚合的結果。下面以restaurants作為資料集,通過將餐館類歸類,我們就可以使用聚合管道在集合上找到5星級餐廳的總數量。
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'test') coll=client[:restaurants] aggregation=coll.aggregate([ {'$match'=>{'stars'=>5}}, {'$unwind'=>'$categories'}, {'$group'=>{'_id'=>'$categories','fiveStars'=>{'$num'=>1}}} ]) aggregation.each do |doc| p doc end
上面的程式中,在aggregate方法內部,第一個引數從所有的文件中過濾出stars欄位為5的文件。第二個引數unwind表明展開categories欄位域,該欄位是一個數組,該引數會將陣列中的條目作為分開的文件。第三個引數將文件按照categories進行歸類,然後統計出五星級飯店的數目。
聚合框架會有最大使用記憶體限制。所以為了處理大資料集合,需要將allowDiskUse引數設定為true,從而確保可以將資料寫到永久性的檔案中。
aggregation=coll.aggregate([<aggregation pipeline expressions]) aggregation_with_disk_use=aggregation.allow_disk_use(true)
或者你可以給aggregate方法傳遞引數
aggregation=coll.aggregate([<aggregation pipeline expressions>],:allow_disk_use=>true)
2. 簡單目的聚合操作
MongoDB為一些聚合函式提供了支援,包含count和distinct
2.1 count
下面的例項為我們展示瞭如何在集合中緊缺找出categories域包含資料['Chinese','Seafood']集合的文件總數量。
client=Mongo::CLient.new(['127.0.0.1:27017'],:database=>'test') coll=client[:restaurants] aggregation =coll.count({'categories':['Chinese','Seafood']}) count=coll.count({'categories'=>['Chinese','Seafood']})
2.2 distinct
distinct方法用於去除結果資料集中的重複資料,為每個記錄返回一個單獨的值。下面的例項是在集合restaurants上找出categories欄位域的所有不重複資料。
client=Mongo::Client.new(['127.0.0.1:27017'],:database=>'test')
coll=client[:restaurants]
aggregation=coll.distinct('categories')
aggregation.each do |doc|
p doc
end
關於MongoDB中聚合操作的講解到此結束