2017-01-25 13 views
2

Возможно ли обновление дочернего атрибута через функцию updateAttributes() от Wirecloud NGSI API?Атрибуты обновления NGSI от сложных объектов в Wirecloud

Например, координата (entity.location.coords.coordinates [0] = - 2.000000) в этой части объекта.

"attrNames": [ "A1", "A2", "position" ], 
    "creDate": 1389376081, 
    "modDate": 1389376244, 
    "location": { 
     "attrName": "position", 
     "coords": { 
      "type": "Point", 
      "coordinates": [ -3.691944, 40.418889 ] 
     } 

EDITED

Мой собственный ответ: Это возможно путем передачи объекта в качестве значения атрибута.

ngsi.updateAttributes([ 
        { 
         'entity': {'id': "entity-id"}, 
         'attributes':[{ 
          "name":"location","contextValue": { 
           "attrName": "position", 
           "coords": { 
            "type": "Point", 
            "coordinates": [ -2.000000, 40.418889 ] 
           } 
          } 
         }] 
        } 
       ], { 
        onSuccess: onUpdateAttributesSuccess, 
        onFailure: onUpdateAttributesFail 
       } 
      ); 

Однако Wirecloud использует NGSI API v1, поэтому все атрибуты трактуются как строки, когда они отправляются/принимаются в/из Orion.

Подробнее: http://fiware-orion.readthedocs.io/en/master/user/structured_attribute_valued/

ответ

0

В настоящее время, это не возможно сделать частичные изменения в атрибут структуры с использованием NGSI API в WireCloud в. Более того, насколько я знаю, API NGSI не обеспечивает прямой способ частичного обновления структурированных атрибутов (ни v1, ни v2).

Однако v1 API NGSI поддерживает значения структурированных атрибутов. Таким образом, вы можете использовать метод updateContext для обновления только одного атрибута (например, атрибута coordinates). Единственное, что нужно учитывать, это то, что вам нужно будет предоставить полную стоимость, поэтому, если вы хотите внести частичное изменение, вам нужно прочитать значение, внести частичное изменение и обновить его.

Фактически, вы почти имеете его работу. Вам нужно только исправить то, как вы передаете обновляемые атрибуты, вы должны обернуть их в массив:

ngsi.updateAttributes([{ 
     "entity": {"id": "entity-id"}, 
     "attributes": [ 
      { 
       "name": "location", 
       "contextValue": { 
        "attrName": "position", 
        "coords": { 
         "type": "Point", 
         "coordinates": [-2.000000, 40.418889] 
        } 
       } 
      } 
     ] 
    }], 
    { 
     onSuccess: onUpdateAttributesSuccess, 
     onFailure: onUpdateAttributesFail 
    } 
);