Details
-
Type: Monitor
-
Status: Closed
-
Priority: Major
-
Resolution: Done
-
Affects Version/s: None
-
Fix Version/s: 2021
-
Component/s: FIWARE-TECH-HELP
-
Labels:
-
HD-Enabler:Cygnus
Description
Created question in FIWARE Q/A platform on 26-04-2018 at 13:04
Please, ANSWER this question AT https://stackoverflow.com/questions/50041404/how-to-store-hierarchical-data-through-fiware-cygnus-with-mongodb
Question:
How to store hierarchical data through FIWARE Cygnus with MongoDB
Description:
I've deployed a FIWARE configuration to receive MQTT messages from TheThingsNetwork. The configuration uses IoTAgent-JSON, Orion and Cygnus, with a MongoDB backend for Cygnus.
The messages are correctly persisted to MongoDB. Unfortunately, the message data having a hierarchical structure, some parts of the message appear as strings in MongoDB, instead of embedded subdocuments.
This makes it difficult to query the data.
Here are the details:
The message format is defined by the TTN MQTT Data API.
I've defined an entity type on Orion as follows:
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":
,
"dev_id":
,
...
"metadata": { "type": "StructuredValue", "value": {
"airtime": 46336000,
"time": "1970-01-01T00:00:00Z",
...
"gateways":
[
]
} }
}
EOF
In particular, in the configuration above, metadata is a structured value, containing an array of gateways.
On IoTAgent-JSON, a service and a device are provisioned:
curl http://localhost:4041/iot/services X POST -H "content-type: application/json" -H "fiware-service: myservice" -H "fiware-servicepath: /mypath" -d @ << EOF
{
"services": [
]
}
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": [
]
}
EOF
Finally, a notification subscription is established from Orion to Cygnus:
curl http://localhost:1026/v1/subscribeContext H "content-type: application/json" -H "fiware-service: myservice" -H "fiware-servicepath: /mypath" -X POST -d @ << EOF
{
"entities": [
],
"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": [
]
}
EOF
The received messages are persisted to 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\":[
]}",
"payload_fields" : "{}",
"payload_raw" : "AQIDBA",
"port" : "1"
}
As can be seen above, the attribute metadata, and in particular the array gateways it contains, are stored as strings and not as JSON subdocuments.
How can I persist the data in a format that can be easily queried? Eg.
with an embedded subdocument under metadata (denormalized form)
or in normalized form where metadata is a separate document that references the main document for the message.
2018-04-30 18:05|CREATED monitor | # answers= 0, accepted answer= False