English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB 모으기

聚合操作处理数据记录并返回计算结果。聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个结果。在SQL中,count(*)和 group by 等效于MongoDB聚合。

Aggregate()方法

对于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 파이프라인 연산자를 통해 처리된 후, 앞쪽 다섯 개 문서가 "필터링"되었습니다.