필드가 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.js
Node.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})
따라서 names
25 세 이상인 컬렉션과 구별 되는 번호를 찾으십시오 .
db.your_collection_name.distinct('names', {'age': {"$gt": 25}})
도움이 되었기를 바랍니다.