Возврат содержимого определенного объекта в массиве - CosmosDB - PullRequest
0 голосов
/ 15 мая 2019

Это продолжение вопроса 56126817

Мой текущий запрос

SELECT c.EventType.EndDeviceEventDetail FROM c 
WHERE c.EventType.EndDeviceEventType.eventOrAction = '93'
AND c.EventType.EndDeviceEventType.subdomain = '137'
AND c.EventType.EndDeviceEventType.domain = '26'
AND c.EventType.EndDeviceEventType.type = '3'
AND ARRAY_CONTAINS(c.EventType.EndDeviceEventDetail,{"name": 
"RCDSwitchReleased","value": "true" })

Вывод моего запроса

[
{
    "EndDeviceEventDetail": [
        {
            "name": "Spontaneous",
            "value": "true"
        },
        {
            "name": "DetectionActive",
            "value": "true"
        },
        {
            "name": "RCDSwitchReleased",
            "value": "true"
        }
    ]
}
]

Вопрос

Как изменить мой запрос, чтобы я выбрал only"значение" массива, который содержит "name" "DetectionActive"?Идея заключается в том, чтобы отфильтровать запрос по одной записи массива и получить в качестве результата «значение» другой записи массива.Из приведенного здесь прочтения следует использовать UDF (не лучший в данном случае) и JOIN.

Первая попытка

SELECT t.value FROM c JOIN t in c.EventType.EndDeviceEventDetail 
WHERE c.EventType.EndDeviceEventType.eventOrAction = '93'
AND c.EventType.EndDeviceEventType.subdomain = '137'
AND c.EventType.EndDeviceEventType.domain = '26'
AND c.EventType.EndDeviceEventType.type = '3'
AND ARRAY_CONTAINS(c.EventType.EndDeviceEventDetail,{"name": 
"RCDSwitchReleased","value": "true" })

Получает ошибку Bad Request (400)

1 Ответ

0 голосов
/ 15 мая 2019

Ваша идея и направление абсолютно верны, я упростил и протестировал ваш sql.

SELECT detail.value  FROM c 
join detail in c.EventType.EndDeviceEventDetail
WHERE c.EventType.EndDeviceEventType.eventOrAction = '93'
AND ARRAY_CONTAINS(c.EventType.EndDeviceEventDetail,{"name": 
"RCDSwitchReleased","value": "true" })

Нашли сообщение об ошибке, как показано ниже:

enter image description here

Это потому, что value является зарезервированным словом в синтаксисе cosmos db sql, пожалуйста, обратитесь к этому случаю: Использование имени поля зарезервированного слова в DocumentDB

Вы можете попробовать изменить sql следующим образом:

SELECT detail["value"]  FROM c 
...