Документы реструктуризации: это возможно? - PullRequest
0 голосов
/ 24 сентября 2018

Скажем, у меня есть коллекция, которая выглядит следующим образом:

{
   "_id":  ObjectId(...),
   "recorded": ISODate("2018-05-05T11:05:32.000"),
   "devices": [
       {
           "id": "KSA2",
           "temp": 32,
           "ttl": 10
       },
       {
           "id": "KSA24",
           "temp": 28,
           "ttl": 10
       }       
   ]  
}
{
   "_id":  ObjectId(...),
   "recorded": ISODate("2018-05-05T18:23:45.000"),
   "devices": [
       {
           "id": "KSA2",
           "temp": 31,
           "ttl": 10
       },
       {
           "id": "KSA24",
           "temp": 16,
           "ttl": 10
       }       
   ]  
}

Что мне нужно сделать, это преобразовать это в документ по устройству:

{
    "Devices": [
        {
            "id": "KSA2",
            "observations": [
                {
                    "time":ISODate("2018-05-05T11:05:32.000"),
                    "temp":32,
                    "ttl":10
                }
                {
                    "time":ISODate("2018-05-05T18:23:45.000"),
                    "temp":31,
                    "ttl":10
                }
            ]


        },
        {
            "id":"KSA24",
            ...
        }
    ]
}

Возможно ли этоделать "внутри" mongodb, используя структуру агрегации, или мне нужно сделать это снаружи с помощью Python или чего-то подобного?

1 Ответ

0 голосов
/ 24 сентября 2018

Запустите следующую совокупность для вашей коллекции:

db['myCollection'].aggregate(
    [
        {
            $unwind: {
                path : "$devices",

            }
        },
        {
            $group: {
            _id : "$devices.id",
            observations : {$push : 
              {
                time : "$recorded",
                temp:"$devices.temp",
                ttl:"$devices.ttl"}
              }
            }
        },
        {
            $out: "devices"
        },
    ],
);

Используемые этапы:

  • $ unwind : создать один документ на элемент устройства.
  • $ group : группировка по идентификатору устройства, отправка пользовательских вложенных документов в массив резервирования.
  • $ out : вывод результата в новую коллекцию,здесь «устройства».

Это выведет в коллекции устройств:

db['devices'].find();
{ 
    "_id" : "KSA24", 
    "observations" : [
        {
            "time" : ISODate("2018-05-05T13:05:32.000+0200"), 
            "temp" : 28.0, 
            "ttl" : 10.0
        }, 
        {
            "time" : ISODate("2018-05-05T20:23:45.000+0200"), 
            "temp" : 16.0, 
            "ttl" : 10.0
        }
    ]
}
{ 
    "_id" : "KSA2", 
    "observations" : [
        {
            "time" : ISODate("2018-05-05T13:05:32.000+0200"), 
            "temp" : 32.0, 
            "ttl" : 10.0
        }, 
        {
            "time" : ISODate("2018-05-05T20:23:45.000+0200"), 
            "temp" : 31.0, 
            "ttl" : 10.0
        }
    ]
}

После этого используйте коллекцию новых устройств или переименуйте ее в старое имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...