之前一直介紹的是Mongo的簡單查詢,在真實的業(yè)務(wù)中,我們可能會設(shè)計到各種的聚合查詢,接下來我們簡單的介紹以下Mongo中的聚合查詢,之后會涉及到Mongo中的一些腳本介紹。
聚合查詢
在以往的系型數(shù)據(jù)庫中,聚合查詢可能是這樣子的
SELECT ID FROM USER GROUP ID
但是在Mongo中我們將用到的是aggregate()方法,aggregate方法的基本語法格式如下
db.collection_name.aggregate(AGGREGATE_OPERATION)
下面我將通過一個簡單的例子來展示aggregate方法的使用.
準備數(shù)據(jù)
準備一個study_book集合,插入一下數(shù)據(jù):
db.study_book.insertMany([{
_id: ObjectId("7df78ad8902c"),
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId("7df78ad8902d"),
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId("7df78ad8902e"),
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
}])
查詢
接下來我們通過aggregate方法統(tǒng)計每個作者寫的文章數(shù)量
db.study_book.aggregate({
$group: {
_id: "$by_user",
counts: {$sum: 1}
}
})
以上語句類似與
select by_user, count(*) from study_book group by by_user
執(zhí)行結(jié)果為:

image.png
解釋:Mongo中聚合是通過管道的形式來定義的,一個管道包含了多個處理階段。上面的命令僅涉及group的操作。
下面展示多個階段操作:
管道
db.study_book.aggregate([
{$group: { _id: "$by_user", counts: {$sum: 1}}},
{$sort: {counts : -1}}
])
該語句執(zhí)行結(jié)果如下:

image.png
上面的命令涉及到了兩個階段(stage) ----group(分組)和sort(排序),其中:
- group階段實現(xiàn)了按指定字段(by_user)的分組計算,sum:1表示按每個文檔累計1進行統(tǒng)計。
- sort階段在分組之后,按照分組計算的結(jié)果輸出,并負責完成排序。
更多操作可以參考下面這張表格:
Mongo中的聚合表達式:

image.png
參考
https://www.runoob.com/mongodb/mongodb-aggregate.html
https://weread.qq.com/web/reader/f1232340724708a1f128522