복붙노트

[MONGODB] MongoDB를 집계 프레임 워크 | 여러 값을 통해 그룹?

MONGODB

MongoDB를 집계 프레임 워크 | 여러 값을 통해 그룹?

내가 좋아하는 조금 보일 것이다 SQL에서 무엇을 실행하여 MongoDB의 집계 프레임 워크를 사용하고 싶습니다 :

SELECT SUM(A), B, C from myTable GROUP BY B, C;

워드 프로세서 상태 :

그러나 실제로 '여러 입력 필드에서 만든 집계 키'불분명입니까?

내 데이터 세트는이 같은 비트입니다 :

[{ "timeStamp" : 1341834988666, "label" : "sharon", "responseCode" : "200", "value" : 10, "success" : "true"},
{ "timeStamp" : 1341834988676, "label" : "paul", "responseCode" : "200", "value" : 60, "success" : "true"},
{ "timeStamp" : 1341834988686, "label" : "paul", "responseCode" : "404", "value" : 15, "success" : "true"},
{ "timeStamp" : 1341834988696, "label" : "sharon", "responseCode" : "200", "value" : 35, "success" : "false"},
{ "timeStamp" : 1341834988166, "label" : "paul", "responseCode" : "200", "value" : 40, "success" : "true"},
{ "timeStamp" : 1341834988266, "label" : "paul", "responseCode" : "404", "value" : 99, "success" : "false"}]

내 쿼리는 다음과 같습니다 :

resultsCollection.aggregate(
    { $match : { testid : testid} },
    { $skip : alreadyRead },
    { $project : {
            timeStamp : 1 ,
            label : 1,
            responseCode : 1 ,
            value : 1,
            success : 1
        }},
    { $group : {
            _id : "$label",
            max_timeStamp : { $timeStamp : 1 },
            count_responseCode : { $sum : 1 },
            avg_value : { $sum : "$value" },
            count_success : { $sum : 1 }
        }},
    { $group : {
            ?
        }}
);

첫 번째 그룹은 이미 너무 많은 데이터 집합을 감소 및 세부 요구 수준이 손실되기 때문에 내 본능이 결과 두 번째 그룹을 통해 파이프 시도했다, 난 당신이 할 수있는 알고 있지만 그것은 작동하지 않습니다.

내가 뭘 원하는 그룹 라벨, 응답 코드와 성공을 사용하고 그 결과에서 값의 합계를 얻을. 이 같은 비트를 보일 것입니다 :

label   | code | success | sum_of_values | count
sharon  | 200  |  true   |      10       |   1
sharon  | 200  |  false  |      35       |   1
paul    | 200  |  true   |      100      |   2
paul    | 404  |  true   |      15       |   1
paul    | 404  |  false  |      99       |   1

어디에서 오 개 그룹이 있습니다 :

1. { "timeStamp" : 1341834988666, "label" : "sharon", "responseCode" : "200", "value" : 10, "success" : "true"}

2. { "timeStamp" : 1341834988696, "label" : "sharon", "responseCode" : "200", "value" : 35, "success" : "false"}

3. { "timeStamp" : 1341834988676, "label" : "paul", "responseCode" : "200", "value" : 60, "success" : "true"}
   { "timeStamp" : 1341834988166, "label" : "paul", "responseCode" : "200", "value" : 40, "success" : "true"}

4. { "timeStamp" : 1341834988686, "label" : "paul", "responseCode" : "404", "value" : 15, "success" : "true"}

5. { "timeStamp" : 1341834988266, "label" : "paul", "responseCode" : "404", "value" : 99, "success" : "false"}

해결법

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

    1.좋아, 그럼 해결책은 _id 값에 대한 집계 키를 지정하는 것입니다. 이 여기로 설명되어 있습니다 :

    좋아, 그럼 해결책은 _id 값에 대한 집계 키를 지정하는 것입니다. 이 여기로 설명되어 있습니다 :

    그러나 실제로 집계 키의 형식을 정의하지 않습니다. 여기에 이전 문서를 읽고 나는 이전 collection.group 방법은 여러 필드를 취할 수와 동일한 구조가 새로운 프레임 워크에 사용되는 것을 보았다.

    {성공 : '$ 성공'응답 코드 : '$ 응답 코드', 라벨 : '$ 라벨을'} 그래서, 여러 분야에 걸쳐 그룹에 당신은 _id 사용할 수 있습니다

    마찬가지로 :

    resultsCollection.aggregate(
    { $match : { testid : testid} },
    { $skip : alreadyRead },
    { $project : {
            timeStamp : 1 ,
            label : 1,
            responseCode : 1 ,
            value : 1,
            success : 1
        }},
    { $group : {
            _id :  { success:'$success', responseCode:'$responseCode', label:'$label'},
            max_timeStamp : { $timeStamp : 1 },
            count_responseCode : { $sum : 1 },
            avg_value : { $sum : "$value" },
            count_success : { $sum : 1 }
        }}
    );
    
  2. from https://stackoverflow.com/questions/11418985/mongodb-aggregation-framework-group-over-multiple-values by cc-by-sa and MIT license