English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
聚合操作处理数据记录并返回计算结果。聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个结果。在SQL中,count(*)和 group by 等效于MongoDB聚合。
对于MongoDB中的聚合,您应该使用 aggregate() 方法。
aggregate()方法的基本语法如下-
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
集合中,您具有以下数据-
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB不是SQL数据库', by_user: 'oldtoolbag.com, url: 'https://ko.oldtoolbag.com, tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No SQL数据库是非常快的', by_user: 'oldtoolbag.com, url: 'https://ko.oldtoolbag.com, tags: ['mongodb', 'database', 'NoSQL'], likes: 10 }, { _id: ObjectId(7df78ad8902e) title: 'Neo4j 개요' description: 'Neo4j 는 No SQL 데이터베이스 by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 },
지금, 위의 집합에서 각 사용자가 몇 개의 강의를 작성했는지 보여주려면 다음을 사용합니다.aggregate()메서드-
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "_id" : "oldtoolbag.com", "num_tutorial" : 2 } { "_id" : "Neo4j", "num_tutorial" : 1 } >
위의 예제의 SQL等效 쿼리는 다음과 같습니다: select by_user, count(*) from mycol group by by_user.
위의 예제에서는 필드에 대해by_user문서를 그룹화하고, 각 사용자에 대해 그룹화할 때마다 이전 sum 값이 증가합니다. 다음은 사용할 수 있는 조인 표현식 목록입니다.
표현식 | 설명 | 예제 |
---|---|---|
$sum | 총 합을 계산합니다. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 평균 값을 계산합니다. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 집합 중 모든 문서에 해당하는 값의 최소 값을 가져옵니다. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 집합 중 모든 문서에 해당하는 값의 최대 값을 가져옵니다. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 결과 문서에 값을 배열에 삽입합니다. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 결과 문서에 값을 배열에 추가하지만, 복제는 생성하지 않습니다. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 자원 문서의 정렬을 통해 첫 번째 문서 데이터를 가져옵니다. | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 자원 문서의 정렬을 통해 마지막 문서 데이터를 가져옵니다. | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
파이프라인은 Unix와 Linux에서 일반적으로 현재 명령의 출력 결과를 다음 명령의 매개변수로 사용.
MongoDB의 집합 파이프라인은 MongoDB 문서를 하나의 파이프라인 처리가 끝나면 결과를 다음 파이프라인에 전달합니다. 파이프라인 연산은 반복할 수 있습니다.
표현식:입력 문서를 처리하고 출력. 표현식은 비상태적이며, 현재 집합 파이프라인의 문서만 계산할 수 있으며, 다른 문서를 처리할 수 없습니다.
여기서는 집합 프레임워크에서 자주 사용하는 몇 가지 연산을 소개합니다:
$project:입력 문서의 구조를 수정. 필드를 이름을 변경하거나 추가하거나 제거할 수 있으며, 계산 결과나 내장 문서를 생성하는 데도 사용할 수 있습니다.
$match:데이터를 필터링하여 만족하는 문서만 출력. $match는 MongoDB의 표준 쿼리 연산을 사용.
$limit:MongoDB 집합 파이프라인이 반환하는 문서 수를 제한.
$skip:집합 파이프라인에서 지정된 수의 문서를 건너뛰고, 나머지 문서를 반환.
$unwind:문서 내의 특정 배열형식 필드를 여러 개로 분할하여, 각각 배열의 하나의 값을 포함합니다.
$group:집합 내 문서를 그룹화하여 통계 결과를 사용할 수 있습니다.
$sort:입력 문서를 정렬한 후 출력.
$geoNear:어떤 지리적 위치에 가까운 순서대로 출력되는 문서.
1、$project 인스턴스
db.article.aggregate( { $project : { }} title : 1 , author : 1 , }}
이렇게 되면 결과에는 \
db.article.aggregate( { $project : { }} _id : 0 , title : 1 , author : 1 }});
2.$match 인스턴스
db.articles.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
$match은 점수가70이나 같거나 작을 때90레코드를 가져온 후, 조건을 만족하는 레코드를 다음 단계 $group 파이프라인 연산자에 보냅니다.
3.$skip 인스턴스
db.article.aggregate( { $skip : 5 });
$skip 파이프라인 연산자를 통해 처리된 후, 앞쪽 다섯 개 문서가 "필터링"되었습니다.