1. 程式人生 > >mongodb聚合管道用法

mongodb聚合管道用法

基本用法

db.collection.aggregate( [ { <stage> }, ... ] )

stage如下

名稱 描述
$addFields 將新的欄位新增到文件中,輸出的文件包含已經存在的欄位和新加入的欄位
$bucket 根據指定的表示式和儲存區邊界將傳入文件分組到稱為buckets的組中。
$bucketAuto 根據指定的表示式將傳入文件分類到特定數量的組(稱為buckets)。儲存區邊界自動確定,試圖將文件均勻分佈到指定數量的buckets中。
$collStats 返回有關集合或檢視的統計資訊。
$count 返回聚合管道的計數
$currentOp 返回有關MongoDB部署的活動和/或休眠操作的資訊
$facet 在同一組輸入文件中的單個階段內處理多個聚合流水線。支援建立多方面的聚合,能夠在單個階段中跨多個維度或方面表徵資料。
$geoNear 根據地理空間點的接近度返回有序的文件流。包含地理空間資料的$ match,$ sort和$ limit功能。輸出檔案包含一個額外的距離欄位,並可包含位置識別符號欄位。
$graphLookup 對集合執行遞迴搜尋。為每個輸出文件新增一個新的陣列欄位,其中包含該文件的遞迴搜尋的遍歷結果
$group 按指定的識別符號表示式輸入文件,並將累加器表示式(如果指定)應用於每個組。消耗所有輸入文件併為每個不同的組輸出一個文件。輸出檔案只包含識別符號欄位,如果指定了,則包含累積欄位。
$indexStats 返回有關使用集合中每個索引的統計資訊。
$limit 將未修改的前n個文件傳遞到管道,其中n是指定的限制。對於每個輸入文件,輸出一個文件(前n個文件)或零文件(前n個文件之後)。
$listLocalSessions 列出最近在當前連線的mongos或mongod例項中使用的所有活動會話。這些會話可能尚未傳播到system.sessions集合。
$listSessions 列出所有活動時間足以傳播到system.sessions集合的所有會話。
$lookup 將左外連線執行到同一資料庫中的另一個集合,以過濾“已連線”集合中的文件進行處理。
$match 過濾文件流,只允許匹配的文件未經修改地傳遞到下一個管道階段。 $ match使用標準的MongoDB查詢。對於每個輸入文件,輸出一個文件(匹配)或零個文件(不匹配)。
$out 將聚合管道的結果文件寫入集合。要使用$ out階段,它必須是管道中的最後一個階段。
$project 重新設計流中的每個文件,例如新增新欄位或刪除現有欄位。對於每個輸入文件,輸出一個文件。
$redact 根據儲存在文件本身中的資訊限制每個文件的內容,重新整形流中的每個文件。包含$ project和$ match的功能。可用於實施欄位級別的編校。對於每個輸入文件,輸出一個或零個文件。
$replaceRoot 用指定的嵌入式文件替換文件。該操作將替換輸入文件中的所有現有欄位,包括_id欄位。指定嵌入在輸入文件中的文件以將嵌入式文件提升到頂層。
$sample 從其輸入中隨機選擇指定數量的文件。
$skip 跳過前n個文件,其中n是指定的跳過編號,並將未修改的其餘文件傳遞到管道。對於每個輸入文件,輸出零文件(對於前n個文件)或一個文件(如果在前n個文件之後)。
$sort 通過指定的排序鍵對文件流進行重新排序。只有訂單改變了;檔案保持不變。對於每個輸入文件,輸出一個文件。
$sortByCount 根據指定表示式的值對傳入文件分組,然後計算每個不同組中文件的數量。
$unwind 從輸入文件解構陣列欄位以輸出每個元素的文件。每個輸出文件用一個元素值替換陣列。對於每個輸入文件,輸出n個文件,其中n是陣列元素的數量,對於空陣列可以為零。

以上翻譯自谷歌翻譯

常用的stage有

$count

經常搭配其他的stage一起使用

樣例

假設資料如下

{ "_id" : 1, "subject" : "History", "score" : 88 }
{ "_id" : 2, "subject" : "History", "score" : 92 }
{ "_id" : 3, "subject" : "History", "score" : 97 }
{ "_id" : 4, "subject" : "History", "score" : 71 }
{ "_id" : 5, "subject" : "History", "score" : 79 }
{ "_id" : 6, "subject" : "History", "score" : 83 }

使用以下聚合操作

db.scores.aggregate(
  [
    {
      $match: {
        score: {
          $gt: 80
        }
      }
    },
    {
      $count: "passing_scores"
    }
  ]
)

意思是匹配score欄位大於80分的文件,然後計算數量,重新命名為passing_scores輸出

輸出如下

{ "passing_scores" : 4 }

$group

用法如下

{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }

<accumulator>操作如下

$sum,$avg,$first,$last,$max,$min,$push,$addToSet,$stdDevPop,$stdDevSamp

用途就跟名稱差不多

樣例

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") }
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") }
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") }
{ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") }
{ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-04T21:23:13.331Z") }

使用以下聚合操作

db.sales.aggregate(
   [
      {
        $group : {
           _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } },
           totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
           averageQuantity: { $avg: "$quantity" },
           count: { $sum: 1 }
        }
      }
   ]
)

意思是將文件根據時間(相同的年月日)分組,並計算其總價格(價格*數量求和),平均的數量,每個分組有多少個文件

結果如下

{ "_id" : { "month" : 3, "day" : 15, "year" : 2014 }, "totalPrice" : 50, "averageQuantity" : 10, "count" : 1 }
{ "_id" : { "month" : 4, "day" : 4, "year" : 2014 }, "totalPrice" : 200, "averageQuantity" : 15, "count" : 2 }
{ "_id" : { "month" : 3, "day" : 1, "year" : 2014 }, "totalPrice" : 40, "averageQuantity" : 1.5, "count" : 2 }

使用以下聚合操作

db.sales.aggregate(
   [
      {
        $group : {
           _id : null,
           totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
           averageQuantity: { $avg: "$quantity" },
           count: { $sum: 1 }
        }
      }
   ]
)

結果如下

{ "_id" : null, "totalPrice" : 290, "averageQuantity" : 8.6, "count" : 5 }

更多操作見https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

$limit

用法如下

db.article.aggregate(
    { $limit : 5 }
);

意思就是現在article只返回前5個文件

$lookup

用法如下

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

from表示另一個要連線的表b,localField表示該表a中用於和表b連線的欄位,foreignField表示表b中用於和表a連線的欄位,as表示為輸出結果命名

SELECT *, <output array field>
FROM collection
WHERE <output array field> IN (SELECT *
                               FROM <collection to join>
                               WHERE <foreignField>= <collection.localField>);

相當於以上的sql語句

另一種用法

{
   $lookup:
     {
       from: <collection to join>,
       let: { <var_1>: <expression>, …, <var_n>: <expression> },
       pipeline: [ <pipeline to execute on the collection to join> ],
       as: <output array field>
     }
}

對應的sql語句

SELECT *, <output array field>
FROM collection
WHERE <output array field> IN (SELECT <documents as determined from the pipeline>
                               FROM <collection to join>
                               WHERE <pipeline> );

樣例

插入如下資料

db.orders.insert([
   { "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 },
   { "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 },
   { "_id" : 3  }
])
db.inventory.insert([
   { "_id" : 1, "sku" : "almonds", description: "product 1", "instock" : 120 },
   { "_id" : 2, "sku" : "bread", description: "product 2", "instock" : 80 },
   { "_id" : 3, "sku" : "cashews", description: "product 3", "instock" : 60 },
   { "_id" : 4, "sku" : "pecans", description: "product 4", "instock" : 70 },
   { "_id" : 5, "sku": null, description: "Incomplete" },
   { "_id" : 6 }
])

使用以下聚合操作

db.orders.aggregate([
   {
     $lookup:
       {
         from: "inventory",
         localField: "item",
         foreignField: "sku",
         as: "inventory_docs"
       }
  }
])

返回結果如下

{
   "_id" : 1,
   "item" : "almonds",
   "price" : 12,
   "quantity" : 2,
   "inventory_docs" : [
      { "_id" : 1, "sku" : "almonds", "description" : "product 1", "instock" : 120 }
   ]
}
{
   "_id" : 2,
   "item" : "pecans",
   "price" : 20,
   "quantity" : 1,
   "inventory_docs" : [
      { "_id" : 4, "sku" : "pecans", "description" : "product 4", "instock" : 70 }
   ]
}
{
   "_id" : 3,
   "inventory_docs" : [
      { "_id" : 5, "sku" : null, "description" : "Incomplete" },
      { "_id" : 6 }
   ]
}

相同sql語句如下

SELECT *, inventory_docs
FROM orders
WHERE inventory_docs IN (SELECT *
FROM inventory
WHERE sku= orders.item);

更多內容見https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#pipe._S_lookup

$match

用法如下

{ $match: { <query> } }

樣例

資料如下

{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }
{ "_id" : ObjectId("55f5a192d4bede9ac365b257"), "author" : "ahn", "score" : 60, "views" : 1000 }
{ "_id" : ObjectId("55f5a192d4bede9ac365b258"), "author" : "li", "score" : 55, "views" : 5000 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b259"), "author" : "annT", "score" : 60, "views" : 50 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b25a"), "author" : "li", "score" : 94, "views" : 999 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b25b"), "author" : "ty", "score" : 95, "views" : 1000 }

聚合操作如下

db.articles.aggregate(
    [ { $match : { author : "dave" } } ]
);

結果如下

{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }

$out

用法如下

{ $out: "<output-collection>" }

樣例

資料如下

{ "_id" : 8751, "title" : "The Banquet", "author" : "Dante", "copies" : 2 }
{ "_id" : 8752, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 }
{ "_id" : 8645, "title" : "Eclogues", "author" : "Dante", "copies" : 2 }
{ "_id" : 7000, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 }
{ "_id" : 7020, "title" : "Iliad", "author" : "Homer", "copies" : 10 }

聚合操作如下

db.books.aggregate( [
                      { $group : { _id : "$author", books: { $push: "$title" } } },
                      { $out : "authors" }
                  ] )

意思是將books的author欄位分類並作為_id欄位的內容,將相同作者的title都push到books欄位中,將其插入authors表中

結果如下

{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }

$project

用法如下

{ $project: { <specification(s)> } }

樣例

資料如下

{
  "_id" : 1,
  title: "abc123",
  isbn: "0001122223334",
  author: { last: "zzz", first: "aaa" },
  copies: 5
}

聚合操作如下

db.books.aggregate( [ { $project : { title : 1 , author : 1 } } ] )

結果如下

{ "_id" : 1, "title" : "abc123", "author" : { "last" : "zzz", "first" : "aaa" } }

更多內容見https://docs.mongodb.com/manual/reference/operator/aggregation/project/#pipe._S_project

$skip

用法如下

{ $skip: <positive integer> }

樣例

db.article.aggregate(
    { $skip : 5 }
);

意思也很簡單就是跳過前5個文件

$sort

用法如下

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

樣例

db.users.aggregate(
   [
     { $sort : { age : -1, posts: 1 } }
   ]
)

-1表示降序排列,1表示升序排列

$sortByCont

用法見https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/#pipe._S_sortByCount

$unwind

用法見https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/#pipe._S_unwind

相關推薦

mongodb聚合管道用法

基本用法 db.collection.aggregate( [ { <stage> }, ... ] ) stage如下 名稱 描述 $addFields 將新的欄位新增到文件中,輸出的文件包含已經存在的欄位和新加入的欄位 $bucket 根據指

MongoDB基礎教程系列--第七篇 MongoDB 聚合管道

https://www.cnblogs.com/liruihuan/p/6686570.html 在講解聚合管道(Aggregation Pipeline)之前,我們先介紹一下 MongoDB 的聚合功能,聚合操作主要用於對資料的批量處理,往往將記錄按條件分組以後,然後再進行一系列操作

MongoDB 聚合管道查詢詳解 aggregate

對於一個MySQL查詢都可以將其轉換成mongodb語句,其轉換順序如下 一,首先分析sql語句的執行順序二,針對其順序進行mongodb語句拼湊例:select count(*) as total from table where name='aaa' group by s

.NET 官方驅動MongoDB.Driver的聚合管道Aggregate用法(二)之操作符的用法示例及細節

上一篇文章寫了如何去寫一個聚合管道的類以及例項化後的基本查詢實現。傳送門 本文筆者想記錄在具體實現按日期統計資料進行Aggregate時,在編寫查詢條件時的一些容易忽略的小細節(筆者自己忽略的和遇到的問題)進行記錄,以備後用,錯誤之處,請留言指正。 1.時間問題

.NET 官方驅動MongoDB.Driver的聚合管道Aggregate用法(一)之 具體實現

工作需要,用到MongoDB,筆者也是邊學邊用,基於官方的驅動MongoDB.Driver的Aggregate具體用法,網上資料甚少,且部分實現記錄並不詳盡。也是邊學邊用,文中錯誤之處,請留言指正。 筆者在儲存和基本的時間範圍查詢時,都可以不使用聚合管道實現而使用約束器FilterDefinit

mongoDB查詢進階】聚合管道(三)--表達式操作符

ips www. name tostring 作用 數組操作 操作符 data seconds https://segmentfault.com/a/1190000010910985 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Operators)

mongodb聚合函式aggregation的用法

1、首先需要自定義一個類,來表示你需要統計的屬性以及統計之後的結果,這裡的_id表示我要統計的屬性,count表示這個屬性的專案總數 class IntegralCount { int _id; int count; public i

MongoDB學習筆記(八)——操作彙總運算子、修飾符、聚合管道

上一篇我列舉了MongoDB shell的所有的方法,該篇我將列舉MongoDB的更新、查詢等的所有操作符、管道聚合操作、管道聚合階段、查詢修飾語等。用作以後大家在使用MongoDB或學習MongoDB時可以使用該篇博文做個集中查閱的文章。 查詢和對映操作

ThinkPHP支援MongoDb Aggregate方法聚合管道

預設的Thinkphp是不支援aggregate聚合的,在使用Mongodb的時候,難免會出現分組等一些複雜的操作,不然的話操作相對很繁瑣。本文介紹下對Thinkphp中MongoModel.class.php和Mongo.class.php的修改使mongo模

Mongodb中資料聚合聚合管道aggregate

面對著廣大使用者對資料統計的需求,Mongodb從2.2版本之後便引入了新的功能聚合框架(aggregation framework),它是資料聚合的新框架,這個概念類似於資料處理中的管道。每個文

MongoDB高階查詢aggregate聚合管道

 先匯入資料庫 $project 、$match 、$group、$sort、$limit、$skip、$lookup 表關聯 db.order.aggregate([ { $project:{ order_id:1,trade_no:1, all_price:1

MongoDB 聚合嵌入的陣列(扁平化資料+管道

MongoDB學習教程 先看下要操作的主要資料結構: { "_id" : "000015e0-3e9c-40b3-bd0d-6e7949f455c0", "evaluation_type" : 2, "reply_count" : 5, "type" : 3,

mongodb $unwind 聚合管道

$unwind:將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值。 需求: { "_id" : ObjectId("5951c5de567ebff0d5011fba"), "name" : "陳曉嬋", "address" : "北京朝陽區",

快速掌握mongoDB(二)——聚合管道和MapReduce

  上一節簡單介紹了一下mongoDB的增刪改查操作,這一節將介紹其聚合操作。我們在使用mysql、sqlserver時經常會用到一些聚合函式,如sum/avg/max/min/count等,mongoDB也提供了豐富的聚合功能,讓我們可以方便地進行資料的分析和計算。這裡主要介紹兩種聚合方式:聚合管道和Map

mongodb聚合查詢

類型 結構 對數 個數字 col 倒序 ron 介紹 catch MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的 count(*)。 $sum 計算總和。 db.mycol.aggr

mongodb MongoDB 聚合 group(轉)

body 輸出 ddt limit 執行 有序 默認 進行 text MongoDB 聚合 MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的 count(*)。 基本語法為:db.col

MongoDB 聚合

auth tro enc 所有 com 例子 sort count 概念 MongoDB 聚合 MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的 count(*)。 aggregate(

MongoDB聚合(單一用途的聚合方法)

con ron 數據 列表 訂單 == 參數 for fun 轉自:http://blog.csdn.net/congcong68/article/details/51419231 聚合指各種可以處理批量記錄並返回計算結果的操作,並MongoDB提供了豐富的聚合操作,M

MongoDB聚合(Aggregation Pipeline基礎篇上

結果集 文檔 https set 閱讀 ins 聚合 sum() 2.6 學習MongoDB 十一: MongoDB聚合(Aggregation Pipeline基礎篇上)(三) 2016年06月09日 10:47:10 閱讀數:15320 一、Aggregate簡介

mongdb的聚合管道

查詢效率 執行 操作類 選項 ODB return 1.3 per clu 我們先介紹一下 MongoDB 的聚合功能,聚合操作主要用於對數據的批量處理,往往將記錄按條件分組以後,然後再進行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚合操作還能夠對記錄進行復雜