분류 Nodejs

실제 사례를 통해 MongoDB 집계 학습-Cloudnweb

컨텐츠 정보

  • 조회 378 (작성일 )

본문

이 기사에서는 mongodb에서 집계가 무엇인지, mongodb 집계 파이프 라인을 작성하는 방법을 살펴 봅니다. 실제 예제를 통해 MongoDB 집계를 학습하십시오. MongoDB에 경험이 있다고 가정합니다.


https://cloudnweb.dev/2019/11/learn-mongodb-aggregation-with-real-world-example/ 


시작 단계에서 mongodb를 사용하기 시작할 때. CRUD (Create Read Update and Delete) 작업을 수행하기 위해 mongodb에서 쿼리를 작성하는 경우가 많습니다.


그러나 응용 프로그램이 더 복잡해지면 응답으로 보내기 전에 데이터에 대해 여러 작업을 수행해야 할 수도 있습니다.


예를 들어, 각 사용자에 대한 작업을 표시해야 하는 분석 대시 보드를 작성한다고 가정하십시오. 여기서 서버는 각 사용자에 대한 모든 작업을 배열로 보내야 합니다.


우리의 데이터에서 이것을 달성하는 방법을 추측 할 수 있습니까?. 여기 Mongodb Aggregation의 역할이 있습니다.


또한 이것은 간단한 예 중 하나이며, 이것보다 훨씬 더 복잡 할 수 있습니다. mongodb이 집계 파이프 라인을 사용하여 이 문제를 어떻게 해결하는지 살펴 보겠습니다.


MongoDB 집계 파이프 라인 


첫째, Mongodb 집계는 각 파이프 라인 단계에서 데이터를 처리하는 파이프 라인입니다. 각 스테이지는 스테이지의 다음 파이프 라인에 대한 입력으로 변환되는 출력을 반환합니다.


monogdb_aggregator.png 


여기서 데이터는 각 파이프 라인에 전달되어 데이터를 필터링, 그룹화 및 정렬하고 결과를 반환합니다.


실제 응용 프로그램에서 널리 사용되는 집계 연산자를 살펴 보겠습니다.


다음은 mongodb 집계 파이프 라인을 구축하는 방법에 대한 예입니다.


pipeline = [
  { $match : { … },
  { $group : { … },
  { $sort : { … },
  ...
]
db.collectionName.aggregate(pipeline, options)


더 나아 가기 전에 기사와 함께 집계를 연습합니다. 이 사이트에서 샘플 데이터 세트를 가져올 수 있습니다.


일단 데이터를 다운로드하십시오. mongoimport 명령을 사용하여 데이터 세트를 mongodb로 가져올 수 있습니다.


import-1024x179.png 


mongoimport --db aggrsample --collection test --file sample.json --jsonArray


$match 


match 연산자는 일치와 집계가 작동한다는 점을 제외하고 mongoDB의 find() 연산자와 유사합니다. 마찬가지로 파이프 라인 match 연산자는 조건을 만족하는 모든 문서를 일치 시킵니다.


위의 데이터 세트에서 MA가 상태 인 모든 문서를 일치 시키십시오.

db.test.aggregate([
    {
      $match: {
        state: 'MA'
      }
    }
  ])
  .pretty();

결과적으로 MA가 상태 인 모든 문서를 찾습니다. 출력은 다음과 같습니다


match_query.png 

$group 


이름에서 알 수 있듯이 특정 필드를 기준으로 문서를 그룹화 합니다. ID 또는 다른 필드 일 수 있습니다.


일치 명령 상단에서 도시별로 문서를 그룹화 하겠습니다.


db.test.aggregate([
  {
    $match: {
      state: 'MA'
    }
  },
  {
    $group: {
      _id: '$city'
    }
  }
]);

또한 다음과 같은 결과를 볼 수 있습니다.


only_group.png 


문서의 모든 필드를 검색하려고 합니다. 그룹화 필드 만 반환하는 이유는 무엇입니까?


글쎄, 그 이유가 있습니다. _id 필드로 문서를 그룹화 하면 (_id 필드는 모든 그룹화 필드를 포함 할 수 있습니다).


그런 다음 그룹화 파이프 라인의 결과를 검색하기 위해 누산기 표현식을 제공해야 합니다. 

인기 있는 누산기 표현은

  • $first – 이 표현식은 그룹화 결과의 첫 번째 문서를 리턴합니다.
  • $push – 그룹화 결과에 따라 모든 문서를 배열로 푸시합니다.
  • $max – 그룹화 문서에서 가장 높은 값을 반환합니다.
  • $sum – 그룹화 문서의 합계 (숫자 값)를 반환합니다.

여기에서는 그룹과 함께 푸시 표현식을 사용하는 방법을 볼 것입니다


db.test
  .aggregate([
    {
      $match: {
        state: 'MA'
      }
    },
    {
      $group: {
        _id: '$city',
        data: {
          $push: '$$ROOT'
        }
      }
    }
  ])
  .pretty();

따라서 다음과 같은 문서를 반환합니다.


group_push.png 


$project 


때로는 문서의 모든 필드가 필요하지 않을 수도 있습니다. 프로젝트 연산자를 사용하여 문서에서 특정 필드 만 검색 할 수 있습니다.


db.test.aggregate([
    {
      $match: {
        state: 'MA'
      }
    },
    {
      $group: {
        _id: '$city',
        data: {
          $push: '$$ROOT'
        }
      }
    },
    {
      $project: {
        _id: 0,
        'data.loc': 1
      }
    }
  ]).pretty();

project_command-1024x552.png 


또한 0 또는 1을 지정하여 특정 필드를 검색 할 수 있습니다. 기본적으로 _id가 검색됩니다. 이를 피하기 위해 _id를 0으로 지정할 수 있습니다.


$sort 


무엇보다도 sort 연산자는 기본적으로 문서를 오름차순 또는 내림차순으로 정렬합니다.


db.test.aggregate([
  {
    $match: {
      state: 'MA'
    }
  },
  {
    $sort: {
      pop: 1
    }
  }
]);

주로 오름차순으로 필드 팝을 기준으로 문서를 정렬합니다 (오름차순이면 1, 내림차순이면 -1).


sort_command.png 


$limit 


limit 연산자는 데이터베이스에서 검색된 문서 수를 제한합니다.


db.test.aggregate([
  {
    $match: {
      state: 'MA'
    }
  },
  {
    $sort: {
      pop: 1
    }
  },
  {
    $limit: 5
  }
]);

따라서 위 쿼리는 데이터베이스에서 5 개의 문서 만 반환합니다.


limit_command.png 


$addFields 


한편 때때로 집계 된 데이터를 포함 할 수 있는 사용자 정의 필드를 작성해야 합니다. $ addField 연산자를 사용하여 이를 달성 할 수 있습니다.


db.test.aggregate([
  {
    $match: {
      state: 'MA'
    }
  },
  {
    $addFields: {
      stateAlias: 'MAS'
    }
  }
]);


결과적으로 다음과 같은 문서를 반환합니다.


addField-1024x553.png 


$lookup 


그 후 조회는 mongodb에서 널리 사용되는 집계 연산자 중 하나입니다. SQL 배경 출신이라면. 이것을 RDBMS의 JOIN Query와 연관 시킬 수 있습니다.


db.universities
  .aggregate([
    { $match: { name: 'USAL' } },
    { $project: { _id: 0, name: 1 } },
    {
      $lookup: {
        from: 'courses',
        localField: 'name',
        foreignField: 'university',
        as: 'courses'
      }
    }
  ])
  .pretty();
  • from – 조인을 수행하려는 컬렉션을 가져옵니다.
  • localField – 입력 문서의 필드를 지정합니다. 여기서는 대학 컬렉션에서 필드 이름을 사용합니다.
  • foreignField – 조인을 수행하는 컬렉션의 필드를 지정합니다. 여기서 코스 컬렉션의 대학 필드입니다.
  • as – 필드 이름의 별명을 지정합니다.

요약 


요약하면, 이들은 MongoDB에서 가장 일반적이고 널리 사용되는 집계 연산자입니다. 다음 기사에서는 mongoDB 집계 연산자의 개념을 심도 있게 살펴볼 것입니다.