필드/키별 고유값의 mongodb 카운트 수
필드에 DB에 포함된 고유 값 수를 계산하기 위한 쿼리가 있습니까?
f.e country 필드를 가지고 있으며, 8가지 국가 가치(스페인, 영국, 프랑스 등)가 있습니다.
만약 누군가가 새로운 국가에 문서를 추가한다면 9를 반환해 주었으면 합니다.
그룹화해서 세는 것보다 더 쉬운 방법은 없을까?
MongoDB에는 필드에 고유한 값의 배열을 반환하는 명령어가 있습니다.계수의 배열 길이를 확인할 수 있습니다.
셸 도우미도 있습니다.
> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]
> db.countries.distinct('country').length
4
MongoDB 매뉴얼에서 설명한 바와 같이:
결과는 최대 BSON 크기(16MB)보다 클 수 없습니다.결과가 최대 BSON 크기를 초과할 경우 집약 파이프라인을 사용하여 개별 값을 가져옵니다.
$group연산자(집약 파이프라인을 사용하여 고유 값 검색)에서 설명한 대로.
다음은 집약 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 이후에서는 연산자와 파이프라인을 사용하여 카운트를 얻을 수 있습니다.
예를 들어 여러 역할을 가진 사용자 모음이 있으며 역할의 개별 개수를 계산하려고 합니다.다음 집약 파이프라인을 실행해야 합니다.
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
}
저는 좀 더 간결한 답변을 원했고 Aggregate와 그룹의 문서를 사용하여 다음과 같이 생각했습니다.
db.countries.aggregate([{"$group": {"_id": "$country", "count":{"$sum": 1}}}])
Mongo Shell Extensions를 활용할 수 있습니다..js Import를 1개만 추가하면$HOME/.mongorc.jsNode.js/io.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수집 중이지만 우리는 조금 원한다.WHEREcondition도 우리가 할 수 있는 것 이상으로 다음과 같습니다.
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}})
도움이 됐으면 좋겠다!
다음 쿼리를 사용합니다.
var collection = "countries"; var field = "country";
db[collection].distinct(field).forEach(function(value){print(field + ", " + value + ": " + db[collection].count({[field]: value}))})
출력:
countries, England: 3536
countries, France: 238
countries, Australia: 1044
countries, Spain: 16
이 쿼리는 먼저 모든 값을 구별한 다음 각 값에 대해 발생 횟수를 카운트합니다.
3.경우 MongoDB 3.4+를 사용할 수 .$count어리게이 션이이이이 :
db.users.aggregate([
{ $group: { _id: '$country' } },
{ $count: 'countOfUniqueCountries' }
]);
언급URL : https://stackoverflow.com/questions/14924495/mongodb-count-num-of-distinct-values-per-field-key
'source' 카테고리의 다른 글
| 단일 그룹 함수가 아닌 SQL (0) | 2023.03.01 |
|---|---|
| 스프링 부트 MVC 테스트 - MockMvc는 항상 null입니다. (0) | 2023.03.01 |
| JSON 기반 RESTful 코드의 예외를 처리하는 방법 (0) | 2023.03.01 |
| remove_action()이 WordPress 플러그인에서 작동하지 않음 (0) | 2023.03.01 |
| 경우에 따라 어레이 또는 객체에 따라서는 JSON의 시리얼화를 해제한다. (0) | 2023.03.01 |