Может ли этот JSON с меткой времени: двойной формат агрегировать для SUM, AVG в MongoDB - PullRequest
0 голосов
/ 19 сентября 2019

Я импортировал вышеупомянутые данные json в его собственную коллекцию в базе данных mongoDB.Я пытаюсь объединить значения (то есть 40, 30, 30) и SUM и AVG их, поскольку они находятся во внутреннем самом встроенном документе.У меня проблемы с этим, когда я пытаюсь использовать точечную нотацию и не могу получить никаких паролей.Я чувствую, что уникальные метки времени (т.е. 1567544426000, 1567541464000, 1567541475000) являются проблемой.Правильно ли отформатирован этот файл json для агрегирования и как мне это сделать?Спасибо за любую помощь или если вы можете даже указать мне правильное направление, где я могу узнать, как сделать SUM, AVG и т. Д. С данными.

Я пытался использовать NoSQLBooster и Query ASsist для MongoDB

{
    "Barcode": "97-1908-577-1032-BE1-332",
    "IP": "192.162.656.111",
    "VFD": {
        "CurrentPV": {
            "Type": "Speed",
            "Data": {
                "1567544426000": 40,
                "1567541464000": 30
                "1567541475000": 30
            }
        },
        "CurrentSP": {
            "Type": "Speed",
            "Data": {
                "1567544426000": 55,
                "1567541464000": 5
                "1567541488000": 10
            }
        },
        "Program_Running": {
            "Type": "Active",
            "Data": {
                "1567544426000": 1,
                "1567541464000": 0
                "1567541475000": 3
            }
        }
    },
    "Equipment": "PieceOfEquipment",
    "Location": "Garage",
    "RunEnd": "NA",
    "RunStart": 1533541438
}

Кажется, я не могу достичь значений, даже когда использую точечную нотацию до объекта ветви «Данные» (т.е. Equipment.VFD.CurrentPV.Data), но наборы результатов не возвращаются.

1 Ответ

0 голосов
/ 19 сентября 2019

Мы можем преобразовать VFD.CurrentPV.Data в массив пар ключ-значение, используя $ objectToArray , а затем выполнить SUM и AVG для самих значений.

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

db.collection.aggregate([
    {
        $addFields:{
            "data":{
                $objectToArray: "$VFD.CurrentPV.Data"
            }
        }
    },
    {
        $project:{
            "sum":{
                $sum:"$data.v"
            },
            "avg":{
                $avg:"$data.v"
            }
        }
    }
]).pretty()

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

{
    "_id" : ObjectId("5d830f3afb35a835fbd8638e"),
    "Barcode" : "97-1908-577-1032-BE1-332",
    "IP" : "192.162.656.111",
    "VFD" : {
        "CurrentPV" : {
            "Type" : "Speed",
            "Data" : {
                "1567544426000" : 40,
                "1567541464000" : 30,
                "1567541475000" : 30
            }
        },
        "CurrentSP" : {
            "Type" : "Speed",
            "Data" : {
                "1567544426000" : 55,
                "1567541464000" : 5,
                "1567541488000" : 10
            }
        },
        "Program_Running" : {
            "Type" : "Active",
            "Data" : {
                "1567544426000" : 1,
                "1567541464000" : 0,
                "1567541475000" : 3
            }
        }
    },
    "Equipment" : "PieceOfEquipment",
    "Location" : "Garage",
    "RunEnd" : "NA",
    "RunStart" : 1533541438
}

Вывод:

{
    "_id" : ObjectId("5d830f3afb35a835fbd8638e"),
    "sum" : 100,
    "avg" : 33.333333333333336
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...