在MongoDb中,如何获取嵌入式数组内部发生的单个匹配元素的max \ min \ avg \ count?

时间:2018-12-27 06:01:32

标签: mongodb mongodb-query aggregation-framework

我有一个MongoDB集合,如下所示。我想在min\max\avg\count

的所有文档中获取xxx字段的$match: { "Parsed.FileId": "421462559", "Parsed.MessageId": "123" }

请注意,每个文档的Fields仅包含一个带有SchemaName = xxx的字段

MongoDB aggregation(或其他功能)有可能吗?如何?

{
    "_id" : NumberLong(409),
    "Parsed" : {
            "FileId" : "421462559",
            "MessageId": "123",
            "Fields" : [
                    {
                            "SchemaName" : "xxx",
                            "Type" : 0,
                            "Value" : 6
                    },
                    {
                            "SchemaName" : "yyy",
                            "Type" : 0,
                            "Value" : 5
                    }
            ]
    }
},
{
    "_id" : NumberLong(510),
    "Parsed" : {
            "FileId" : "421462559",
            "MessageId": "123",
            "Fields" : [
                    {
                            "SchemaName" : "xxx",
                            "Type" : 0,
                            "Value" : 10
                    },
                    {
                            "SchemaName" : "yyy",
                            "Type" : 0,
                            "Value" : 20
                    }
            ]
    }
}

对于上面的示例集合,我希望将字段xxx的结果转换为:

{
    count: 2,
    min: 6,
    max: 10,
    avg: 8
}

1 个答案:

答案 0 :(得分:0)

您可以在aggregation下使用

基本上,您需要首先$unwind嵌套数组,然后必须将 $group与相应的累加器一起使用,即min max $sum $avg

db.collection.aggregate([
  { "$match": { "Parsed.Fields.SchemaName": "xxx" }},
  { "$unwind": "$Parsed.Fields" },
  { "$match": { "Parsed.Fields.SchemaName": "xxx" }},
  { "$group": {
    "_id": null,
    "count": { "$sum": 1 },
    "max": { "$max": "$Parsed.Fields.Value" },
    "min": { "$min": "$Parsed.Fields.Value" },
    "avg": { "$avg": "$Parsed.Fields.Value" }
  }}
])