Mongodb 计算相同值在数组中出现的次数

Mongodb 计算相同值在数组中出现的次数,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,在聚合中分组后,我有如下元素: {_id: ID, items: ["yes", "no", "yes", "no", "no", "yes", "no", "no", "no"]} 我想预测某个值在items数组中存在多少次 以以下格式的文档结束: {_id: ID, yes: 3, no: 6} 您可以在聚合管道中再添加两个阶段 { $unwind: '$items' } 然后再按项目分组 { $group: { _id: '$items', count: { $sum: 1 }}}

在聚合中分组后,我有如下元素:

{_id: ID, items: ["yes", "no", "yes", "no", "no", "yes", "no", "no", "no"]}
我想预测某个值在items数组中存在多少次

以以下格式的文档结束:

{_id: ID, yes: 3, no: 6}

您可以在聚合管道中再添加两个阶段

{ $unwind: '$items' }
然后再按
项目分组

{ $group: { _id: '$items', count: { $sum: 1 }}}
这将生成如下数组:

[{ _id: 'yes', count: 3}, { _id: 'no', count: 6}]

使用运算符的组合,根据给定条件筛选项目数组并分别返回计数。例如,运行以下管道以获得所需的结果。当然,这假定项目列表中的不同二进制元素
“yes”
“no”
事先已知:

db.collection.aggregate([
    {
        "$project": {
            "yes": {
                "$size": {
                    "$filter": {
                        "input": "$items",
                        "as": "item",
                        "cond": {
                            "$eq": ["$$item", "yes"]
                        }
                    }
                }
            },
            "no": {
                "$size": {
                    "$filter": {
                        "input": "$items",
                        "as": "item",
                        "cond": {
                            "$eq": ["$$item", "no"]
                        }
                    }
                }
            }
        }
    }
])

对于事先不知道不同元素的解决方案,则需要项数组,将展开的文档分组并将计数聚合为:

db.collection.aggregate([
    { "$unwind": "$items" },
    {
        "$group": {
            "_id": "$items",
            "id": { "$first": "$_id" },
            "count": { "$sum": 1 }
        }
    },
    {
        "$group": {
            "_id": "$id",
            "counts": {
                "$push": {
                    "item": "$_id",
                    "count": "$count"
                }
            }
        }
    }
])
样本输出

{
    "_id" : ID,
    "counts" : [ 
        {
            "item" : "yes",
            "count" : 3
        }, 
        {
            "item" : "no",
            "count" : 6
        }
    ]
}
db.collection.aggregate([
“$project”:{
_id:1,
“是”:{
$size:{
“$map”:{
输入:“$items”,
如:“是”,
在:{“$eq”:[“$$Yes”,“Yes”]}
}
}
}
“否”:{
“$size”:{
“$map”:{
输入:“$items”,
如:“否”,
在:{“$eq”:[“$$No”,“No”]}
}
}
}
}
])