1. 程式人生 > >Ruby操作MongoDB(進階八)-聚合操作Aggregation

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中聚合操作的講解到此結束