Как проверить наличие поля в JSON в CosmosDB: SQL, nodeJS
Быстрый ответ
Для проверки существования поля в JSON-документе, хранящемся в CosmosDB, используйте функцию IS_DEFINED
:
SELECT IS_DEFINED(c.FieldName) AS fieldExists FROM c WHERE c.id = 'YourDocumentId'
Если поле существует, функция IS_DEFINED
вернёт значение true
, и false
– в противном случае.
Увеличение производительности запросов с использованием IS_DEFINED
Обращение к JSON-документам в CosmosDB может быть ресурсоемким. Функция IS_DEFINED
позволяет делать эффективные запросы, проверяя существование поля без его извлечения, что снижает затраты вычислительных ресурсов:
SELECT c.FieldName FROM c WHERE IS_DEFINED(c.FieldName)
Это более предпочтительно, нежели:
SELECT c.FieldName FROM c WHERE c.FieldName != null
Вышеуказанный пример демонстрирует преимущества в производительности при использовании функции IS_DEFINED
.
Применение IS_DEFINED в условных SQL-выражениях
Функция IS_DEFINED
— это многофункциональный инструмент для работы с условной логикой в CosmosDB, позволяющий строить динамические SQL-выражения:
SELECT
c.id,
CASE
WHEN IS_DEFINED(c.optionalField) THEN c.optionalField
ELSE "Н/Д"
END AS OptionalField
FROM c
В зависимости от наличия поля, такой гибкий подход к составлению SQL-выражений позволяет адаптировать вывод информации.
Потенциальные проблемы: будьте внимательны с значением NULL
С функцией IS_DEFINED
связаны определённые особенности. Она не различает поле, заданное как null, и поле, которого нет — в обоих случаях она вернёт значение false
. Если важно отличить эти ситуации, то сочетайте проверку на null с функцией IS_DEFINED
:
SELECT c.FieldName FROM c
WHERE IS_DEFINED(c.FieldName) AND c.FieldName != null
Визуализация
Для наглядности воспользуемся аналогией:
Представим JSON-документ как замок (🏰), где каждое поле в документе — это отдельная комната.
JSON-документ: 🏰 { "библиотека": { "книга": "BigData для начинающих" }, "сад": null }
SQL-запрос: SELECT * FROM замок m WHERE IS_DEFINED(m.библиотека.книга)
Мы нашли книгу "BigData для начинающих" в библиотеке:
Обнаружен предмет: 📖 (так как 'библиотека.книга' существует в документе)
Теперь попробуем найти статую в саду:
SQL-запрос: SELECT * FROM замок m WHERE IS_DEFINED(m.сад.статуя)
Статуя не была найдена:
Предмет отсутствует: 🌿 (т.к. 'сад.статуя' не существует)
Вложенные поля и IS_DEFINED: до какой глубины мы можем заглянуть?
CosmosDB позволяет создавать сложные JSON-документы с вложенными полями. Для проверки существования таких полей используйте IS_DEFINED
, способную достигнуть требуемого уровня вложенности:
SELECT IS_DEFINED(c.образование.университет.степень.предмет) AS subjectExists FROM c
Это особенно полезно для документов с большим количеством уровней вложенности.
Полезные материалы
Для углублённого изучения работы с Cosmos DB и функцией IS_DEFINED
рекомендуем следующие ресурсы:
- Запросы NoSQL – Azure Cosmos DB для NoSQL | Microsoft Learn
- Быстрый старт – клиентская библиотека на Node.js – Azure Cosmos DB для NoSQL | Microsoft Learn
- IS_DEFINED – Azure Cosmos DB для NoSQL | Microsoft Learn
- GitHub – Azure-Samples/azure-cosmos-db-sql-api-nodejs-getting-started
- Работа с Azure Cosmos DB в Node.js | TutorialKart
- Лучшие практики проектирования схем и составления запросов NoSQL в Cosmos DB – YouTube