source

집계 프레임워크를 사용한 MongoDB의 그룹 수

lovecheck 2023. 5. 2. 22:46
반응형

집계 프레임워크를 사용한 MongoDB의 그룹 수

내 MongoDB 스키마가 다음과 같이 생겼다고 가정해 보겠습니다.

{car_id: "...", owner_id: "..."}

이것은 다대다 관계입니다.예를 들어 데이터는 다음과 같습니다.

+-----+----------+--------+
| _id | owner_id | car_id |
+-----+----------+--------+
|   1 |        1 |      1 |
|   2 |        1 |      2 |
|   3 |        1 |      3 |
|   4 |        2 |      1 |
|   5 |        2 |      2 |
|   6 |        3 |      4 |
|   7 |        3 |      5 |
|   8 |        3 |      6 |
|   9 |        3 |      7 |
|  10 |        1 |      1 | <-- not unique
+-----+----------+--------+

저는 각 소유자가 소유한 자동차의 수를 얻고 싶습니다.SQL에서는 다음과 같이 표시됩니다.

SELECT owner_id, COUNT(*) AS cars_owned
FROM (SELECT owner_id FROM car_owners GROUP BY owner_id, car_id) AS t
GROUP BY owner_id;

이 경우 결과는 다음과 같습니다.

+----------+------------+
| owner_id | cars_owned |
+----------+------------+
|        1 |          3 |
|        2 |          2 |
|        3 |          4 |
+----------+------------+

집계 프레임워크를 사용하여 MongoDB를 사용하여 동일한 작업을 수행하려면 어떻게 해야 합니까?

잠재적인 중복 항목을 수용하려면 두 개를 사용해야 합니다.$group작업:

db.test.aggregate([
    { $group: {
        _id: { owner_id: '$owner_id', car_id: '$car_id' }
    }},
    { $group: {
        _id: '$_id.owner_id',
        cars_owned: { $sum: 1 }
    }},
    { $project: {
        _id: 0,
        owner_id: '$_id',
        cars_owned: 1
    }}]
    , function(err, result){
        console.log(result);
    }
);

다음 형식의 결과를 제공합니다.

[ { cars_owned: 2, owner_id: 10 },
  { cars_owned: 1, owner_id: 11 } ]

$group명령에 의한 SQL 그룹과 유사합니다.다음 예제에서는 회사가 설립된 연도를 기준으로 회사를 집계합니다.그리고 각 회사의 평균 직원 수를 계산합니다.


db.companies.aggregate([{
    $group: {
      _id: {
        founded_year: "$founded_year"
      },
      average_number_of_employees: {
        $avg: "$number_of_employees"
      }
    }
  }, {
    $sort: {
      average_number_of_employees: -1
    }
  }
])

$avg 연산자 MongoDB

이 집계 파이프라인에는 2단계가 있습니다.

  1. $group
  2. $sort

이제, 기본적으로$group무대는_id문서의 일부로 지정하는 필드입니다.그것이 바로 그 가치입니다.$group연산자 자체가 매우 엄격한 월권 프레임워크 구문 해석을 사용합니다. _id그룹 스테이지가 표시하는 문서를 구성하기 위해 사용하는 것을 정의하고, 제어하고, 조정하는 방법입니다.

아래 질의는 사람들과 회사들의 관계를 찾습니다.$sum연산자:


db.companies.aggregate([{
  $match: {
    "relationships.person": {
      $ne: null
    }
  }
}, {
  $project: {
    relationships: 1,
    _id: 0
  }
}, {
  $unwind: "$relationships"
}, {
  $group: {
    _id: "$relationships.person",
    count: {
      $sum: 1
    }
  }
}, {
  $sort: {
    count: -1
  }
}])

$sum(MongoDB)

언급URL : https://stackoverflow.com/questions/13240039/group-count-with-mongodb-using-aggregation-framework

반응형