MongoDB 집계 파이프라인

PHPz
풀어 주다: 2024-07-31 20:32:41
원래의
872명이 탐색했습니다.

MongoDB Aggregation Pipelines

안녕하세요, 외계인 여러분! 나는 파반이다. 그래서 이번 Repository에서는 기본적인 예시를 통해 Aggregation의 모든 단계를 심도있게 설명하겠습니다. 추가 학습을 위한 리소스 링크도 포함하겠습니다.

따라서 이 저장소에는 다양한 MongoDB 집계 파이프라인을 위한 JSON 파일이 포함되어 있습니다. 이러한 파이프라인은 다양한 집계 단계와 작업을 사용하여 데이터를 처리하고 분석하는 방법을 보여줍니다.

목차

  • 소개
  • CRUD 작업
  • 집계 단계
    • $매치
    • $그룹
    • $프로젝트
    • $정렬
    • $한도
    • $건너뛰기
    • $조회
    • $풀기
    • $addFields
    • $replaceRoot
  • 집계 작업
    • $sum
    • 평균$
    • $분
    • 최대$
    • $첫 번째
    • $마지막
  • 예시 데이터세트
  • 추가 학습을 위한 리소스

소개

MongoDB의 집계는 컬렉션에 저장된 데이터를 처리하고 분석하는 강력한 방법입니다. 이를 통해 데이터 필터링, 그룹화, 정렬, 변환과 같은 작업을 수행할 수 있습니다.

CRUD 작업

만들다

db.orders.insertOne({
  "order_id": 26,
  "cust_id": 1006,
  "status": "A",
  "amount": 275,
  "items": ["apple", "banana"],
  "date": "2023-01-26"
});
로그인 후 복사

읽다

db.orders.find().pretty();
로그인 후 복사

업데이트

db.orders.updateOne(
  { "order_id": 2 },
  {
    $set: { "status": "C", "amount": 500 },
    $currentDate: { "lastModified": true }
  }
);
로그인 후 복사

삭제

db.orders.deleteOne({ "order_id": 1 });
로그인 후 복사

집계 단계

$match

지정된 조건과 일치하는 문서만 다음 파이프라인 단계로 전달하도록 문서를 필터링합니다.

db.orders.aggregate([
  { $match: { "status": "A" } }
]);
로그인 후 복사

$group

지정된 _id 표현식을 기준으로 입력 문서를 그룹화하고 각각의 개별 그룹에 대해 문서를 출력합니다. _id 필드에는 값별로 고유한 그룹이 포함되어 있습니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$cust_id",
      totalSpent: { $sum: "$amount" }
    }
  }
]);
로그인 후 복사
로그인 후 복사

$프로젝트

요청된 필드가 포함된 문서를 파이프라인의 다음 단계로 전달합니다.

db.orders.aggregate([
  { $project: { "order_id": 1, "items": 1, "_id": 0 } }
]);
로그인 후 복사

$sort

모든 입력 문서를 정렬하고 정렬된 순서대로 파이프라인에 반환합니다.

db.orders.aggregate([
  { $sort: { "amount": -1 } }
]);
로그인 후 복사

$한도

파이프라인의 다음 단계로 전달되는 문서 수를 제한합니다.

db.orders.aggregate([
  { $limit: 5 }
]);
로그인 후 복사

$건너뛰기

처음 n개 문서를 건너뛰고 나머지 문서를 파이프라인의 다음 단계로 전달합니다.

db.orders.aggregate([
  { $skip: 5 }
]);
로그인 후 복사
로그인 후 복사

$조회

동일한 데이터베이스의 다른 컬렉션에 대해 왼쪽 외부 조인을 수행하여 "조인된" 컬렉션의 문서를 필터링하여 처리합니다.

db.orders.aggregate([
  {
    $lookup: {
      from: "orderDetails",
      localField: "order_id",
      foreignField: "order_id",
      as: "details"
    }
  }
]);
로그인 후 복사
로그인 후 복사

$unwind

입력 문서에서 배열 필드를 분해하여 각 요소에 대한 문서를 출력합니다.

db.orders.aggregate([
  { $unwind: "$items" }
]);
로그인 후 복사
로그인 후 복사

$addFields

문서에 새 필드를 추가합니다.

db.orders.aggregate([
  { $addFields: { totalWithTax: { $multiply: ["$amount", 1.1] } } }
]);
로그인 후 복사

$replaceRoot

입력 문서를 지정된 문서로 바꿉니다.

db.orders.aggregate([
  { $replaceRoot: { newRoot: "$items" } }
]);
로그인 후 복사
로그인 후 복사

집계 작업

$sum

숫자 값의 합계를 계산하고 반환합니다. $sum은 숫자가 아닌 값을 무시합니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$cust_id",
      totalSpent: { $sum: "$amount" }
    }
  }
]);
로그인 후 복사
로그인 후 복사

$평균

숫자 값의 평균값을 계산하여 반환합니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$cust_id",
      averageSpent: { $avg: "$amount" }
    }
  }
]);
로그인 후 복사

$min

숫자 값 중 최소값을 반환합니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$cust_id",
      minSpent: { $min: "$amount" }
    }
  }
]);
로그인 후 복사

$max

숫자 값 중 최대값을 반환합니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$cust_id",
      maxSpent: { $max: "$amount" }
    }
  }
]);
로그인 후 복사

$first

각 그룹의 문서에서 첫 번째 값을 반환합니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$cust_id",
      firstOrder: { $first: "$amount" }
    }
  }
]);
로그인 후 복사

$마지막

각 그룹의 문서에서 마지막 값을 반환합니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$cust_id",
      lastOrder: { $last: "$amount" }
    }
  }
]);
로그인 후 복사

예시 데이터 세트

CRUD 및 집계 작업을 수행하는 데 사용되는 문서 예:

[
  { "order_id": 1, "cust_id": 1001, "status": "A", "amount": 250, "items": ["apple", "banana"], "date": "2023-01-01" },
  { "order_id": 2, "cust_id": 1002, "status": "B", "amount": 450, "items": ["orange", "grape"], "date": "2023-01-02" },
  { "order_id": 3, "cust_id": 1001, "status": "A", "amount": 300, "items": ["apple", "orange"], "date": "2023-01-03" },
  { "order_id": 4, "cust_id": 1003, "status": "A", "amount": 150, "items": ["banana", "grape"], "date": "2023-01-04" },
  { "order_id": 5, "cust_id": 1002, "status": "C", "amount": 500, "items": ["apple", "banana"], "date": "2023-01-05" },
  { "order_id": 6, "cust_id": 1004, "status": "A", "amount": 350, "items": ["orange", "banana"], "date": "2023-01-06" },
  { "order_id": 7, "cust_id": 1005, "status": "B", "amount": 200, "items": ["grape", "banana"], "date": "2023-01-07" },
  { "order_id": 8, "cust_id": 1003, "status": "A", "amount": 100, "items": ["apple", "orange"], "date": "2023-01-08" },
  { "order_id": 9, "cust_id": 1004, "status": "C", "amount": 400, "items": ["banana", "grape"], "date": "2023-01-09" },
  { "order_id": 10, "cust_id": 1001, "status": "A", "amount": 250, "items": ["apple", "grape"], "date": "2023-01-10" },
  { "order_id": 11, "cust_id": 1002, "status": "B", "amount": 350, "items": ["orange", "banana"], "date": "2023-01-11" },
  { "order_id": 12, "cust_id": 1003, "status": "A", "amount": 450, "items": ["apple", "orange"], "date": "2023-01-12" },
  { "order_id": 13, "cust_id": 1005, "status": "A", "amount": 150, "items": ["banana", "grape"], "date": "2023-01-13" },
  { "order_id": 14, "cust_id": 1004, "status": "C

", "amount": 500, "items": ["apple", "banana"], "date": "2023-01-14" },
  { "order_id": 15, "cust_id": 1002, "status": "A", "amount": 300, "items": ["orange", "grape"], "date": "2023-01-15" },
  { "order_id": 16, "cust_id": 1003, "status": "B", "amount": 200, "items": ["apple", "banana"], "date": "2023-01-16" },
  { "order_id": 17, "cust_id": 1001, "status": "A", "amount": 250, "items": ["orange", "grape"], "date": "2023-01-17" },
  { "order_id": 18, "cust_id": 1005, "status": "A", "amount": 350, "items": ["apple", "banana"], "date": "2023-01-18" },
  { "order_id": 19, "cust_id": 1004, "status": "C", "amount": 400, "items": ["orange", "grape"], "date": "2023-01-19" },
  { "order_id": 20, "cust_id": 1001, "status": "B", "amount": 150, "items": ["apple", "orange"], "date": "2023-01-20" },
  { "order_id": 21, "cust_id": 1002, "status": "A", "amount": 500, "items": ["banana", "grape"], "date": "2023-01-21" },
  { "order_id": 22, "cust_id": 1003, "status": "A", "amount": 450, "items": ["apple", "banana"], "date": "2023-01-22" },
  { "order_id": 23, "cust_id": 1004, "status": "B", "amount": 350, "items": ["orange", "banana"], "date": "2023-01-23" },
  { "order_id": 24, "cust_id": 1005, "status": "A", "amount": 200, "items": ["grape", "banana"], "date": "2023-01-24" },
  { "order_id": 25, "cust_id": 1001, "status": "A", "amount": 300, "items": ["apple", "orange"], "date": "2023-01-25" }
]
로그인 후 복사

추가 학습을 위한 리소스

  • MongoDB 집계 문서
  • MongoDB 대학 강좌
  • MongoDB 집계 파이프라인 빌더

자유롭게 이 저장소를 복제하고 제공된 집계 파이프라인을 실험해 보세요. 질문이나 제안 사항이 있는 경우 이슈를 열거나 풀 요청을 제출해 주세요.

$group

주문을 상태별로 그룹화하여 상태별 총액과 평균 금액을 계산합니다.

db.orders.aggregate([
  {
    $group: {
      _id: "$status",
      totalAmount: { $sum: "$amount" },
      averageAmount: { $avg: "$amount" }
    }
  }
]);
로그인 후 복사

$프로젝트

주문 ID, 고객 ID 및 세금이 포함된 총액에 대한 계산 필드를 투영합니다(세금 10% 가정).

db.orders.aggregate([
  {
    $project: {
      "order_id": 1,
      "cust_id": 1,
      "totalWithTax": { $multiply: ["$amount", 1.1] }
    }
  }
]);
로그인 후 복사

$sort

주문을 상태별로 오름차순으로 정렬한 다음 금액별로 내림차순으로 정렬합니다.

db.orders.aggregate([
  { $sort: { "status": 1, "amount": -1 } }
]);
로그인 후 복사

$한도

금액이 가장 높은 상위 3개 주문으로 결과를 제한합니다.

db.orders.aggregate([
  { $sort: { "amount": -1 } },
  { $limit: 3 }
]);
로그인 후 복사

$건너뛰기

처음 5개 주문을 건너뛰고 나머지는 반품합니다.

db.orders.aggregate([
  { $skip: 5 }
]);
로그인 후 복사
로그인 후 복사

$조회

orderDetails 컬렉션과 주문 컬렉션을 결합하여 주문 세부정보를 추가합니다.

db.orders.aggregate([
  {
    $lookup: {
      from: "orderDetails",
      localField: "order_id",
      foreignField: "order_id",
      as: "details"
    }
  }
]);
로그인 후 복사
로그인 후 복사

$unwind

Deconstructs the items array in each order to output a document for each item.

db.orders.aggregate([
  { $unwind: "$items" }
]);
로그인 후 복사
로그인 후 복사

$addFields

Adds a new field discountedAmount which is 90% of the original amount.

db.orders.aggregate([
  { $addFields: { discountedAmount: { $multiply: ["$amount", 0.9] } } }
]);
로그인 후 복사

$replaceRoot

Replaces the root document with the items array.

db.orders.aggregate([
  { $replaceRoot: { newRoot: "$items" } }
]);
로그인 후 복사
로그인 후 복사

$sum

Calculates the total amount for all orders.

db.orders.aggregate([
  {
    $group: {
      _id: null,
      totalAmount: { $sum: "$amount" }
    }
  }
]);
로그인 후 복사

$avg

Calculates the average amount spent per order.

db.orders.aggregate([
  {
    $group: {
      _id: null,
      averageAmount: { $avg: "$amount" }
    }
  }
]);
로그인 후 복사

$min

Finds the minimum amount spent on an order.

db.orders.aggregate([
  {
    $group: {
      _id: null,
      minAmount: { $min: "$amount" }
    }
  }
]);
로그인 후 복사

$max

Finds the maximum amount spent on an order.

db.orders.aggregate([
  {
    $group: {
      _id: null,
      maxAmount: { $max: "$amount" }
    }
  }
]);
로그인 후 복사

$first

Gets the first order placed (by date).

db.orders.aggregate([
  { $sort: { "date": 1 } },
  {
    $group: {
      _id: null,
      firstOrder: { $first: "$$ROOT" }
    }
  }
]);
로그인 후 복사

$last

Gets the last order placed (by date).

db.orders.aggregate([
  { $sort: { "date": -1 } },
  {
    $group: {
      _id: null,
      lastOrder: { $last: "$$ROOT" }
    }
  }
]);
로그인 후 복사

So, we have covered basic CRUD operations, all major aggregation stages, and operations, and looked into resources for further learning.

위 내용은 MongoDB 집계 파이프라인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!