В MongoDb, как получить максимальный \ min \ avg \ count одиночного сопоставленного элемента во встроенном массиве? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть коллекция 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 голосов
/ 27 декабря 2018

Вы можете использовать ниже 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" }
  }}
])
...