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

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

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

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

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



답변

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

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

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

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


답변

다음은 집계 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 }


답변

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
}


답변

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,
  ...
}


답변

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

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


답변