복붙노트

[MONGODB] MongoDB를이 통합 프레임 워크를 사용하여와 그룹 수

MONGODB

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를 사용하여이 같은 일을 수행 할 수 있습니까?

해결법

  1. ==============================

    1.잠재적 중복을 수용하기 위해, 당신은 두 개의 $ 그룹 작업을 사용해야합니다 :

    잠재적 중복을 수용하기 위해, 당신은 두 개의 $ 그룹 작업을 사용해야합니다 :

    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 } ]
    
  2. ==============================

    2.$ 그룹은 명령에 의해 SQL 그룹과 유사하다. 아래의 예에서, 우리는 그들이 설립 된 연도를 기준으로 집계 기업 것입니다. 그리고 각 회사에 대한 직원의 평균을 계산합니다.

    $ 그룹은 명령에 의해 SQL 그룹과 유사하다. 아래의 예에서, 우리는 그들이 설립 된 연도를 기준으로 집계 기업 것입니다. 그리고 각 회사에 대한 직원의 평균을 계산합니다.

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

    이 집계 파이프 라인은 2 단계가 있습니다

    이제, $ 조별 리그에 근본적인 우리는 문서의 일부로서 지정하는 _id 필드입니다. 즉, 사칭 프레임 워크 구문의 매우 엄격한 해석을 사용하여 $ 그룹 연산자 자체의 값입니다. _id 우리가 조정 조별 사용하는 그것을보고하는 문서를 구성하기 위해 무엇을 어떻게, 우리가 제어하는 ​​방법을 정의하는 방법이다.

    쿼리 아래는 $ 합 연산자를 사용하여 기업과 사람의 관계를 찾을 수 있습니다 :

    
    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
      }
    }])

  3. from https://stackoverflow.com/questions/13240039/group-count-with-mongodb-using-aggregation-framework by cc-by-sa and MIT license