如何根据 MOngoDB 聚合中的条件查找计数?
How to find count based on condition in MOngoDB Aggregation?
我需要获取不同的 categoryCode 和 categoryName 并使用重复文档的这种组合打印计数。这是匹配操作的一个条件获取所有基于 cat_type 的文档,如果 cat_type 不存在则在类别响应计数中显示为 0 样本数据:
[
{
"cat_id":1,
"categoryCode":"categoryCode1",
"categoryName":"categoryName1",
"cat":[
{
"type":"A"
},
{
"type":"B"
},
{
"type":"C"
}
]
},
{
"cat_id":2,
"categoryCode":"categoryCode1",
"categoryName":"categoryName1",
"cat":[
{
"type":"A"
}
]
},
{
"cat_id":3,
"categoryCode":"categoryCode2",
"categoryName":"categoryName2",
"cat":[
{
"type":"C"
}
]
},
{
"cat_id":4,
"categoryCode":"categoryCode3",
"categoryName":"categoryName3",
"cat":[
{
"type":"A"
}
]
}
]
预期输出:这里匹配 type='A',category1 和 category3 有 type='A' 然后 count 正常打印但是 category2 没有这个 cat_type 然后 category2 也显示响应 cat_count=0
[
{
"categoryCode":"categoryCode1",
"categoryName":"categoryName1",
"cat_count": 2
},
{
"categoryCode":"categoryCode2",
"categoryName":"categoryName2",
"cat_count": 0
},
{
"categoryCode":"categoryCode3",
"categoryName":"categoryName3",
"cat_count": 1
}
]
我正在使用查询 - 但查询与外部字段一起使用,但在基于数组的条件下不起作用
db.collection.aggregate([
{
"$group":{
"_id":{
"categoryCode":"$categoryCode",
"categoryName":"$categoryName"
},
"catCount":{
"$sum":{
"$cond":{
"if":{
"$eq":[
"$cat.type",
"A"
]
},
"then":1,
"else":0
}
}
}
}
},
{
"$project":{
"categoryCode":"$_id.categoryCode",
"categoryName":"$_id.categoryName",
"catCount":1,
"_id":0
}
}
])
您可以尝试先通过$reduce
计算/统计cat
数组中type: A
个元素的个数。然后$sum
结果在$group
得到你的答案。
{
"$group": {
"_id": {
"categoryCode": "$categoryCode",
"categoryName": "$categoryName"
},
"catCount": {
"$sum": {
"$reduce": {
"input": "$cat",
"initialValue": 0,
"in": {
"$cond": {
"if": {
$eq: [
"$$this.type",
"A"
]
},
"then": {
// add 1 to accumulator if type is A
$add: [
"$$value",
1
]
},
// otherwise, simply keep the accumulator as-is
"else": "$$value"
}
}
}
}
}
}
}
这里是Mongo playground供您参考。
只需要使用$in
运算符条件而不是$eq
运算符条件,
{
$group: {
_id: {
"categoryCode": "$categoryCode",
"categoryName": "$categoryName"
},
"cat_count": {
$sum: {
$cond: [{ $in: ["A", "$cat.type"] }, 1, 0]
}
}
}
}
我需要获取不同的 categoryCode 和 categoryName 并使用重复文档的这种组合打印计数。这是匹配操作的一个条件获取所有基于 cat_type 的文档,如果 cat_type 不存在则在类别响应计数中显示为 0 样本数据:
[
{
"cat_id":1,
"categoryCode":"categoryCode1",
"categoryName":"categoryName1",
"cat":[
{
"type":"A"
},
{
"type":"B"
},
{
"type":"C"
}
]
},
{
"cat_id":2,
"categoryCode":"categoryCode1",
"categoryName":"categoryName1",
"cat":[
{
"type":"A"
}
]
},
{
"cat_id":3,
"categoryCode":"categoryCode2",
"categoryName":"categoryName2",
"cat":[
{
"type":"C"
}
]
},
{
"cat_id":4,
"categoryCode":"categoryCode3",
"categoryName":"categoryName3",
"cat":[
{
"type":"A"
}
]
}
]
预期输出:这里匹配 type='A',category1 和 category3 有 type='A' 然后 count 正常打印但是 category2 没有这个 cat_type 然后 category2 也显示响应 cat_count=0
[
{
"categoryCode":"categoryCode1",
"categoryName":"categoryName1",
"cat_count": 2
},
{
"categoryCode":"categoryCode2",
"categoryName":"categoryName2",
"cat_count": 0
},
{
"categoryCode":"categoryCode3",
"categoryName":"categoryName3",
"cat_count": 1
}
]
我正在使用查询 - 但查询与外部字段一起使用,但在基于数组的条件下不起作用
db.collection.aggregate([
{
"$group":{
"_id":{
"categoryCode":"$categoryCode",
"categoryName":"$categoryName"
},
"catCount":{
"$sum":{
"$cond":{
"if":{
"$eq":[
"$cat.type",
"A"
]
},
"then":1,
"else":0
}
}
}
}
},
{
"$project":{
"categoryCode":"$_id.categoryCode",
"categoryName":"$_id.categoryName",
"catCount":1,
"_id":0
}
}
])
您可以尝试先通过$reduce
计算/统计cat
数组中type: A
个元素的个数。然后$sum
结果在$group
得到你的答案。
{
"$group": {
"_id": {
"categoryCode": "$categoryCode",
"categoryName": "$categoryName"
},
"catCount": {
"$sum": {
"$reduce": {
"input": "$cat",
"initialValue": 0,
"in": {
"$cond": {
"if": {
$eq: [
"$$this.type",
"A"
]
},
"then": {
// add 1 to accumulator if type is A
$add: [
"$$value",
1
]
},
// otherwise, simply keep the accumulator as-is
"else": "$$value"
}
}
}
}
}
}
}
这里是Mongo playground供您参考。
只需要使用$in
运算符条件而不是$eq
运算符条件,
{
$group: {
_id: {
"categoryCode": "$categoryCode",
"categoryName": "$categoryName"
},
"cat_count": {
$sum: {
$cond: [{ $in: ["A", "$cat.type"] }, 1, 0]
}
}
}
}