MongoDB 그룹 수 선택 기준


180

MongoDB와 함께 놀고 간단한 방법을 알아 내려고 노력 중입니다.

SELECT province, COUNT(*) FROM contest GROUP BY province

그러나 집계 함수를 사용하여 알아낼 수는 없습니다. 정말 이상한 그룹 구문을 사용하여 할 수 있습니다.

db.user.group({
    "key": {
        "province": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    }
});

그러나 집계 기능을 사용하는 더 쉽고 빠른 방법이 있습니까?

답변:


326

이것은 다음을 사용하여 더 쉬운 방법입니다 aggregate.

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])

1
시도 할 때 오류 메시지가 표시 "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",됩니까?
Steven

어떻게 분류합니까? -1로 정렬하고 싶습니다
Filip Bartuzi

4
@FilipBartuzi 문서 페이지에 예제가 있습니다. 파이프 라인에 정렬 작업을 추가해야합니다.{ $sort: { count: -1 } }
elaich

@Steven과 동일한 예외가 있었으며 2 행만 복사하여 붙여 넣고 주변 대괄호를 생략했기 때문입니다.
피터 Perháč

pls는 mongoDB의 관련 질문에 대해 도움이 될 경우 도움이됩니다.- stackoverflow.com
newdeveloper

66

집계 함수의 결과를 기반으로 추가 작업이 필요합니다. 마지막으로 MongoDB의 결과를 기반으로 집계 함수 및 작업에 대한 솔루션을 찾았습니다. Requestfield 가있는 컬렉션 이 있습니다 request, source, status, requestDate.

단일 필드 그룹 및 수 :

db.Request.aggregate([
    {"$group" : {_id:"$source", count:{$sum:1}}}
])

여러 필드 그룹 및 개수 :

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])

필드를 사용하여 정렬하여 여러 필드 그룹화 및 계산 :

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"_id.source":1}}
])

다중 필드 그룹 별 및 개수를 사용한 정렬 :

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])

50

그룹화 할 여러 열이 필요한 경우이 모델을 따르십시오. 여기에 의해 과수를 수행 status하고 있습니다 type.

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })

2
_id는 여러 필드를 캡슐화하기위한 기본 매개 변수를 나타 냅니까?
Eugen Sunic

18

또한 그룹화를 제한해야하는 경우 다음을 사용할 수 있습니다.

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)

17

MongoDB 3.4부터는 $sortByCount집계를 사용할 수 있습니다 .

지정된 표현식의 값을 기준으로 수신 문서를 그룹화 한 다음 각 개별 그룹의 문서 수를 계산합니다.

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

예를 들면 다음과 같습니다.

db.contest.aggregate([
    { $sortByCount: "$province" }
]);

2
아마도 $sortByCountMongoDB 3.4에서 소개 된 몇 가지 더 많은 집계 단계 연산자와 같은 "의사 연산자"라는 점에서 주목할 가치가 있습니다 . 그들이 실제로하는 일은 각자의 집계 단계로 확장 하는 것입니다. 이 경우 A의 $group$sum: 1기존의 답변 및 추가와 같이 $sort 무대. "더 적은 코드를 입력하는" 이외의 이점 은 없습니다. 더 설명 적이 지 않을 수도 있습니다. 코드의 IMHO, 구별 $group$sort단계는 훨씬 더 설명적이고 실제로 더 유연합니다.
Neil Lunn


0

나를 위해 일한 몽고 쉘 명령 :

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.