Проверьте содержимое массива - CosmosDB - PullRequest
0 голосов
/ 14 мая 2019

Я запрашиваю базу данных CosmosDB, используя следующий запрос:

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')

получаю в ответ

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

Я бы хотел пойти дальше и изменить свой запрос так, чтобы я получал ответ только в том случае, если "RCDSwitchReleased" имеет значение true.

Я наивно пытался безуспешно:

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 c.EventType.EndDeviceEventDetail[2].value = 'true'

но я получаю сообщение об ошибке BadRequest (400). Любое направление / помощь для достижения этого?

1 Ответ

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

Проблема с Value Ключевым словом.Cosmos SQL использует значение ключевого слова по-разному, это может быть причиной, мы не можем использовать поле значения в запросе выбора.

Я изменил документ с помощью value1 вместо value, тогда ваш запрос работает.

Предложение

Если вы применяете фильтр вмассив, всегда используйте Array_Contains .Если порядок значений в вашем массиве EndDeviceEventDetail изменится, ваш запрос не вернет правильный результат.

Мой запрос

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","value1": "true" })

Вывод запроса

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