mongodb는 필드 / 키당 고유 값 수를 계산합니다.


104

필드가 DB에 포함하는 고유 값 수를 계산하는 쿼리가 있습니까?

fe 국가 필드가 있고 국가 값에는 8 가지 유형 (스페인, 영국, 프랑스 등)이 있습니다.

누군가가 새로운 국가로 더 많은 문서를 추가하면 쿼리에서 9를 반환하고 싶습니다.

그룹화하고 계산하는 것이 더 쉬운 방법이 있습니까?


2
집계 프레임 워크 를 살펴 보셨습니까 ?
WiredPrairie 2013


답변:


198

MongoDB에는 필드에 대한 고유 값 배열을 반환하는 distinct명령 이 있습니다. 카운트에 대한 배열의 길이를 확인할 수 있습니다.

db.collection.distinct()도우미도 있습니다.

> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]

> db.countries.distinct('country').length
4

47
고유 한 값의 수가 너무 많으면 작동하지 않습니다. 세상에있는 사람들의 고유 한 이름 등을보고있는 경우. 확장 가능한 답변이 있습니까?
언더런

3
길이는 1+입니다. 나는 그런 것을 찾기 위해 고군분투하고 있었다. 감사.
Adeel Ahmad 2015 년

그들이 사용 횟수 (하지는 왜 나뿐만 아니라이) 알고하지는
마리아 Klühspies에게

1
@ MarianKlühspies-요소 수를 계산하기 위해 length 속성을 사용하는 자바 스크립트 배열이기 때문입니다.
UpTheCreek

내가 찾던 것 ... TY
Maulzey

113

다음은 집계 API를 사용하는 예입니다. 대소 문자를 복잡하게 만들기 위해 문서의 배열 속성에서 대소 문자를 구분하지 않는 단어로 그룹화합니다.

db.articles.aggregate([
    {
        $match: {
            keywords: { $not: {$size: 0} }
        }
    },
    { $unwind: "$keywords" },
    {
        $group: {
            _id: {$toLower: '$keywords'},
            count: { $sum: 1 }
        }
    },
    {
        $match: {
            count: { $gte: 2 }
        }
    },
    { $sort : { count : -1} },
    { $limit : 100 }
]);

다음과 같은 결과를주는

{ "_id" : "inflammation", "count" : 765 }
{ "_id" : "obesity", "count" : 641 }
{ "_id" : "epidemiology", "count" : 617 }
{ "_id" : "cancer", "count" : 604 }
{ "_id" : "breast cancer", "count" : 596 }
{ "_id" : "apoptosis", "count" : 570 }
{ "_id" : "children", "count" : 487 }
{ "_id" : "depression", "count" : 474 }
{ "_id" : "hiv", "count" : 468 }
{ "_id" : "prognosis", "count" : 428 }

2
+이 답변에만 로그인했습니다. 감사! btw 고유 한 필드에서 수행하는 경우 해제 선을 제거하십시오.
Richie Rich

@RichieRich unwind는 코드가 distinct작동 방식 과 일치하는 배열 필드의 개별 값을 그룹화하기 때문에 필요 합니다.
Paul

@Paul Richie가 말한 것은 그룹화가 "일반"필드 (문자열, 정수 등) 만 수행되면 해제 단계가 필요하지 않다는 것입니다. 맞지 않나요?
guyarad

@guyarad unwind는 배열로 작업 할 때 필요합니다.
Paul '

답을 위해 +1, 정확히 내가 작업하고 있던 것, 그러나 뚜렷한 고유의 매력이 있지만 이것은 금색 일뿐입니다. :)-어쨌든 데이터를 필터링하기 위해 원하는 결과 집합을 얻으려면 집계에 대해 자세히 읽어야합니다
Talha

21

MongoDb 3.4.4 이상에서는 $arrayToObject연산자와 $replaceRoot파이프 라인을 사용하여 카운트를 얻을 수 있습니다.

예를 들어 서로 다른 역할을 가진 사용자 모음이 있고 역할의 고유 수를 계산하려고한다고 가정합니다. 다음 집계 파이프 라인을 실행해야합니다.

db.users.aggregate([
    { "$group": {
        "_id": { "$toLower": "$role" },
        "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": null,
        "counts": {
            "$push": { "k": "$_id", "v": "$count" }
        }
    } },
    { "$replaceRoot": {
        "newRoot": { "$arrayToObject": "$counts" }
    } }    
])

예제 출력

{
    "user" : 67,
    "superuser" : 5,
    "admin" : 4,
    "moderator" : 12
}

이것은 질문에 대한 답은 아니지만 그럼에도 불구하고 도움이됩니다. 나는 이것이 .distinct().
Redsandro 2019

9

Mongo Shell Extensions를 활용할 수 있습니다 . $HOME/.mongorc.jsNode.js / io.js로 코딩하는 경우 .js 파일에 추가 하거나 프로그래밍 방식으로 추가 할 수있는 단일 .js 가져 오기입니다 .

견본

필드의 각 고유 값에 대해 쿼리로 선택적으로 필터링 된 문서의 발생 수를 계산합니다.

> db.users.distinctAndCount('name', {name: /^a/i})

{
  "Abagail": 1,
  "Abbey": 3,
  "Abbie": 1,
  ...
}

필드 매개 변수는 필드의 배열 일 수 있습니다.

> db.users.distinctAndCount(['name','job'], {name: /^a/i})

{
  "Austin,Educator" : 1,
  "Aurelia,Educator" : 1,
  "Augustine,Carpenter" : 1,
  ...
}

노드에서 어떻게 가져올 수 있습니까?
Salmaan P

require("./script.js"), 나는 추측한다
evandrix

맞아요,하지만 내부 기능을 가져올 수 없었습니다. 어떻게 사용합니까? 그들은 db.protoptype.distinctAndCount로 정의
Salmaan P

repo의 readme (RTFM! 1 !! 1!)에는 기본적으로 .mongorc.js파일을 홈 디렉토리에 넣는 방법 섹션이 있습니다. 끝난.
Janis F

6

field_1컬렉션 에서 구별되는 것을 찾으려면 WHERE다음과 같이 할 수있는 것보다 몇 가지 조건 을 원합니다 .

db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})

따라서 names25 세 이상인 컬렉션과 구별 되는 번호를 찾으십시오 .

db.your_collection_name.distinct('names', {'age': {"$gt": 25}})

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.