Mongodb 按值分组并计算出现的次数
Mongodb group by values and count the number of occurence
我正在尝试计算某个特定值在集合中出现了多少次。
{
_id:1,
field1: value,
field2: A,
}
{
_id:2,
field1: value,
field2: A,
}
{
_id:3,
field1: value,
field2: C,
}
{
_id:4,
field1: value,
field2: B,
}
我想要的是计算 A 出现的次数、B 出现的次数和 C 出现的次数 return 计数。
我想要的输出
{
A: 2,
B: 1,
C: 1,
}
您可以像这样在聚合管道中使用 $facet
:
$facet
创建“三种方式”,其中每种方式都按所需键(A、B 或 C)过滤值。
- 然后在
$project
阶段就可以得到匹配值的$size
。
db.collection.aggregate([
{
"$facet": {
"first": [
{
"$match": {
"field2": "A"
}
}
],
"second": [
{
"$match": {
"field2": "B"
}
}
],
"third": [
{
"$match": {
"field2": "C"
}
}
]
}
},
{
"$project": {
"A": {
"$size": "$first"
},
"B": {
"$size": "$second"
},
"C": {
"$size": "$third"
}
}
}
])
示例here
这是聚合管道中 $group
阶段的典型用例。你可以这样做:
$group
- 按 field2 对所有文档进行分组
$sum
- 统计field2 每个值的文档数
db.collection.aggregate([
{
"$group": {
"_id": "$field2",
"count": {
"$sum": 1
}
}
}
])
利用 $arrayToObject
operator and a final $replaceWith
管道获得所需的结果。您需要 运行 以下聚合管道:
db.collection.aggregate([
{ $group: {
_id: { $toUpper: '$field2' },
count: { $sum: 1 }
} },
{ $group: {
_id: null,
counts: {
$push: { k: '$_id', v: '$count' }
}
} },
{ $replaceWith: { $arrayToObject: '$counts' } }
])
我正在尝试计算某个特定值在集合中出现了多少次。
{
_id:1,
field1: value,
field2: A,
}
{
_id:2,
field1: value,
field2: A,
}
{
_id:3,
field1: value,
field2: C,
}
{
_id:4,
field1: value,
field2: B,
}
我想要的是计算 A 出现的次数、B 出现的次数和 C 出现的次数 return 计数。
我想要的输出
{
A: 2,
B: 1,
C: 1,
}
您可以像这样在聚合管道中使用 $facet
:
$facet
创建“三种方式”,其中每种方式都按所需键(A、B 或 C)过滤值。- 然后在
$project
阶段就可以得到匹配值的$size
。
db.collection.aggregate([
{
"$facet": {
"first": [
{
"$match": {
"field2": "A"
}
}
],
"second": [
{
"$match": {
"field2": "B"
}
}
],
"third": [
{
"$match": {
"field2": "C"
}
}
]
}
},
{
"$project": {
"A": {
"$size": "$first"
},
"B": {
"$size": "$second"
},
"C": {
"$size": "$third"
}
}
}
])
示例here
这是聚合管道中 $group
阶段的典型用例。你可以这样做:
$group
- 按 field2 对所有文档进行分组
$sum
- 统计field2 每个值的文档数
db.collection.aggregate([
{
"$group": {
"_id": "$field2",
"count": {
"$sum": 1
}
}
}
])
利用 $arrayToObject
operator and a final $replaceWith
管道获得所需的结果。您需要 运行 以下聚合管道:
db.collection.aggregate([
{ $group: {
_id: { $toUpper: '$field2' },
count: { $sum: 1 }
} },
{ $group: {
_id: null,
counts: {
$push: { k: '$_id', v: '$count' }
}
} },
{ $replaceWith: { $arrayToObject: '$counts' } }
])