Проверить содержимое массива CosmosDB

Я запрашиваю базу данных 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" истинно.

Я наивно безуспешно попробовал:

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). Любое направление / помощь в достижении этого?


person Christopher Coello    schedule 14.05.2019    source источник


Ответы (1)


Проблема с 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"
        }
    ]
}
]
person Pankaj Rawat    schedule 14.05.2019
comment
Это очень полезно и работает как шарм. Спасибо, что поделился своим опытом, Панкадж. - person Christopher Coello; 15.05.2019
comment
Могу я задать дополнительный вопрос: как вернуть только значение записи массива, которая содержит имя DetectionActive? Вместо того, чтобы возвращать как сегодня весь массив. Я пробовал sthg под (но вернул логическое значение), но кажется, что мне может понадобиться какое-то соединение здесь? `SELECT ARRAY_CONTAINS (c.EndDeviceEvent.Payload.EventType.EndDeviceEventDetail, {'name': 'DetectionActive'}) FROM c ... etc ...` - person Christopher Coello; 15.05.2019
comment
Я задал для этого новый вопрос: stackoverflow.com/questions/56145931/ - person Christopher Coello; 15.05.2019
comment
Позвольте мне проверить этот вопрос - person Pankaj Rawat; 15.05.2019