Как хранить иерархические данные через FIWARE Cygnus с MongoDB - PullRequest
0 голосов
/ 26 апреля 2018

Я развернул конфигурацию FIWARE для получения сообщений MQTT из TheThingsNetwork. Конфигурация использует IoTAgent-JSON, Orion и Cygnus, с бэкэндом MongoDB для Cygnus.

Сообщения правильно сохраняются в MongoDB. К сожалению, в данных сообщения, имеющих иерархическую структуру, некоторые части сообщения отображаются в MongoDB как строки, а не как вложенные вложенные документы.

Это затрудняет запрос данных.

Вот подробности:

Формат сообщения определяется API данных TTN MQTT .

Я определил тип сущности на Орионе следующим образом:

curl http://localhost:1026/v2/entities -X POST -H "content-type: application/json" -H "fiware-service: myservice" -H "fiware-servicepath: /mypath" -d @- << EOF
{
    "id": "TtnMqttMessage",
    "type": "TtnMqttMessge",
    "app_id": { "type": "Text", "value": "my-app-id" },
    "dev_id": { "type": "Text", "value": "my-dev-id" },
    ...
    "metadata": { "type": "StructuredValue", "value": {
        "airtime": 46336000,
        "time": "1970-01-01T00:00:00Z",
        ...
        "gateways": 
        [ 
            {
                "gw_id": "gw1",
                "timestamp": 12345,
                "time": "1970-01-01T00:00:00Z",
                ...
                "altitude": 6
            }
        ]
    } }
}
EOF

В частности, в приведенной выше конфигурации metadata является структурированным значением, содержащим массив gateways.

В IoTAgent-JSON служба и устройство предоставляются:

curl http://localhost:4041/iot/services -X POST -H "content-type: application/json" -H "fiware-service: myservice" -H "fiware-servicepath: /mypath" -d @- << EOF
{
    "services": [
        {
            "apikey": "my_app_id",
            "entity_type": "TtnMqttMessage",
            "resource": "/iot/json"
        }
    ]
}
EOF

curl http://localhost:4041/iot/devices?options=keyValues -X POST -H "content-type: application/json" -H "fiware-service: myservice" -H "fiware-servicepath: /mypath" -d @- << EOF
{
    "devices": [{
        "device_id": "my_device_id",
        "entity_name": "TtnMqttMessage",
        "entity_type": "TtnMqttMessage",
        "timezone": "Europe/Zurich",
        "transport": "MQTT"
    }]
}
EOF

Наконец, подписка на уведомления устанавливается из Ориона в Лебедя:

curl http://localhost:1026/v1/subscribeContext -H "content-type: application/json" -H "fiware-service: myservice" -H "fiware-servicepath: /mypath" -X POST  -d @- << EOF
{
    "entities": [
        {
            "type": "TtnMqttMessage",
            "isPattern": "false",
            "id": "TtnMqttMessage"
        }
    ],
    "attributes": [ "app_id", "dev_id", "hardware_serial", "port", "counter",  "is_retry",  "confirmed", "payload_raw", "payload_fields", "metadata" ],
    "reference": "http://cygnus:5050/notify",
    "duration": "P100Y",
    "notifyConditions": [
        {
            "type": "ONCHANGE",
            "condValues": [ "app_id", "dev_id", "payload_raw", "counter" ]
        }
    ]
}
EOF

Полученные сообщения сохраняются в MongoDB:

> mongo
> ...
> db['..collectionname...'].findOne();
{
    "_id" : ObjectId("5adf0b904cedfd001cd72113"),
    "recvTime" : ISODate("2018-04-24T10:48:47.605Z"),
    "app_id" : "my-app-id",
    "confirmed" : "false",
    "counter" : "2",
    "dev_id" : "my-dev-id",
    "hardware_serial" : "0102030405060708",
    "is_retry" : "false",
    "metadata" : "{\"airtime\":4.6336e+07,\"time\":\"1970-01-01T00:00:00Z\",\"frequency\":868.1,\"modulation\":\"LORA\",\"data_rate\":\"SF7BW125\",\"bit_rate\":50000,\"coding_rate\":\"4/5\",\"latitude\":52.2345,\"longitude\":6.2345,\"altitude\":2,\"gateways\":[{\"gw_id\":\"gw1\",\"timestamp\":12345,\"time\":\"1970-01-01T00:00:00Z\",\"channel\":0,\"rssi\":-25,\"snr\":5,\"rf_chain\":0,\"latitude\":52.1234,\"longitude\":6.1234,\"altitude\":6}]}",
    "payload_fields" : "{}",
    "payload_raw" : "AQIDBA",
    "port" : "1"
}

Как видно выше, атрибут metadata и, в частности, массив gateways, который он содержит, хранятся как строки, а не как вложенные документы JSON.

Как мне сохранить данные в формате, который можно легко запросить? Например.

  • со встроенным поддокументом в metadata (денормализованная форма)
  • или в нормализованной форме, где metadata - отдельный документ, который ссылается на основной документ для сообщения.

1 Ответ

0 голосов
/ 11 мая 2018

Созданная сущность выглядит хорошо структурированной, я замечаю, что вы создаете сущность с использованием v2, но вы подписываетесь на получение уведомлений с использованием v1, я знаю, что это правильный способ сделать это, но, возможно, по этой причине генерируется неправильное поведение ,

...