MongoDB按名称对数组中的项进行计数

MongoDB按名称对数组中的项进行计数,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有这样的文件: { "_id" : ObjectId("5b3ced158735f1196d73a743"), "cid" : 1, "foo" : [ { "k" : "sport", "v" : "climbing" }, { "k" : "sport", "v" : "soccer" },

我有这样的文件:

{
    "_id" : ObjectId("5b3ced158735f1196d73a743"),
    "cid" : 1,
    "foo" : [
        {
            "k" : "sport",
            "v" : "climbing"
        },
        {
            "k" : "sport",
            "v" : "soccer"
        },
        {
            "k" : "sport",
            "v" : "soccer"
        }
    ]
}
此查询只返回包含足球场的文档

db.coll.find({foo:{$elemMatch:{ v: "soccer"}} }, {"foo.$" : 1,cid:1})
返回:

{ "_id" : ObjectId("5b3ced158735f1196d73a743"), "cid" : 1, "node" : [ { "k" : "sport", "v" : "climbing" } ] }

但我想知道,每个返回的文档中有多少个足球元素。我怎么能数呢

您可以使用下面的查询和筛选的数组来计算匹配出现的次数

db.coll.aggregate([
  {"$project":{
    "cid":1,
    "count":{
      "$size":{
        "$filter":{
          "input":"$foo",
          "cond":{"$eq":["$$this.v","soccer"]
          }
        }
      }
    }
  }}
])

我只是想知道我是否明白你的问题。你期望产出:2?我说的对吗?是的,cid和count。有很多这样的文件。我需要例如:{cid:1,count:4},{cid:3,count:2}很酷,但是我如何才能返回count>0的字段呢?您可以在项目之后添加匹配阶段。类似于
{“$match”:{“count”:{“$gt”:0}}}
非常感谢:+1:
db.coll.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                foo: {
                    $elemMatch: {
                        v: 'soccer'
                    }
                }
            }
        },

        // Stage 2
        {
            $unwind: {
                path: '$foo'
            }
        },

        // Stage 3
        {
            $project: {
                cid: 1,
                count: {
                    $cond: {
                        if: {
                            $eq: ['$foo.v', 'soccer']
                        },
                        then: {
                            $sum: 1
                        },
                        else: 0
                    }
                }
            }
        },

        // Stage 4
        {
            $group: {
                _id: '$cid',
                total_count: {
                    $sum: '$count'
                }
            }
        }

    ]



);