Подсчитайте больше значений в то время Монго - PullRequest
1 голос
/ 25 сентября 2019

Как я могу посчитать больше значений за раз?Моя коллекция выглядит следующим образом, и я хочу посчитать поля msg и severity

[
  {
    "msg": "A",
    "severity": "hello1",
    "group": "bb"
  },
  {
    "msg": "B",
    "severity": "hello1",
    "group": "bb"
  },
  {
    "msg": "A",
    "severity": "hello2",
    "group": "bb"
  },
  {
    "msg": "C",
    "severity": "hello2",
    "group": "bb"
  }
]

Результат, который я хочу получить, выглядит примерно так:

[
    [{
        "_id" : "A",
        "count" : 2.0
    },
    {
        "_id" : "B",
        "count" : 1.0
    },
    {
        "_id" : "C",
        "count" : 1.0
    }],
    [{
        "_id" : "hello1",
        "count" : 2.0
    },
    {
        "_id" : "hello2",
        "count" : 2.0
    }],
]

Икод, который я пробовал:

db.getCollection('events').aggregate({
    $and: [
    {
        [
            { $unwind: "$msg" },
            {
                $group: {
                    _id: {$toLower: '$msg'},
                    count: { $sum: 1 }
                }
            }
        ]
    },
    {
        [
            { $unwind: "$severity" },
            {
                $group: {
                    _id: {$toLower: '$severity'},
                    count: { $sum: 1 },
                }
            }
        ]
    }]
}).toArray();

Но я получаю эту ошибку:

Ошибка: строка 5: неожиданный токен,

Thisкод начался с:

db.getCollection('events').aggregate([
    { $unwind: "$msg" },
    {
        $group: {
            _id: {$toLower: '$msg'},
            count: { $sum: 1 }
        }
    }
]).toArray();

И он работает правильно (только для поля msg);Я только что попытался объединить 2 $unwind и 2 $group

Вот фрагмент

Спасибо за ваше время!

1 Ответ

1 голос
/ 25 сентября 2019

Мы можем выполнить параллельные конвейеры для набора данных, используя $ facet .

Следующий запрос может дать нам ожидаемый результат:

db.collection.aggregate([
    {
        $facet:{
            "messagesInfo":[
                {
                    $group:{
                        "_id":{
                            $toLower:"$msg"
                        },
                        "msg":{
                            $first:"$msg"
                        },
                        "count":{
                            $sum:1
                        }
                    }
                },
                {
                    $project:{
                        "_id":0
                    }
                }
            ],
            "severityInfo":[
                {
                    $group:{
                        "_id":{
                            $toLower:"$severity"
                        },
                        "severity":{
                            $first:"$severity"
                        },
                        "count":{
                            $sum:1
                        }
                    }
                },
                {
                    $project:{
                        "_id":0
                    }
                }
            ]
        }
    }
]).pretty()

Набор данных:

{
    "_id" : ObjectId("5d8bb2751b53cab235fc20e0"),
    "msg" : "A",
    "severity" : "hello1",
    "group" : "bb"
}
{
    "_id" : ObjectId("5d8bb2751b53cab235fc20e1"),
    "msg" : "B",
    "severity" : "hello1",
    "group" : "bb"
}
{
    "_id" : ObjectId("5d8bb2751b53cab235fc20e2"),
    "msg" : "A",
    "severity" : "hello2",
    "group" : "bb"
}
{
    "_id" : ObjectId("5d8bb2751b53cab235fc20e3"),
    "msg" : "C",
    "severity" : "hello2",
    "group" : "bb"
}

Выход:

{
    "messagesInfo" : [
        {
            "msg" : "C",
            "count" : 1
        },
        {
            "msg" : "B",
            "count" : 1
        },
        {
            "msg" : "A",
            "count" : 2
        }
    ],
    "severityInfo" : [
        {
            "severity" : "hello2",
            "count" : 2
        },
        {
            "severity" : "hello1",
            "count" : 2
        }
    ]
}
...