Implémenter le contrôle de type dans les requêtes
L’un des avantages d’Azure Cosmos DB for NoSQL en tant que magasin de données est sa flexibilité pour stocker des données avec des structures et des formes variables. À mesure que les développeurs créent des requêtes pour ces données, la responsabilité de la vérification des types tombe souvent sur vos requêtes. Le langage de requête SQL de l’API NoSQL inclut une suite de fonctions intégrées pour vous permettre de vérifier les types de propriétés ou d’expressions à la volée lorsqu’elles sont variables ou inconnues.
Jusqu’à présent, l’exemple de structure de données est simple et facile à comprendre. Mais considérons quelques exceptions possibles.
Chaque élément de produit dans le conteneur possède une propriété nommée tags. La propriété tags est un tableau d’objets dotés de propriétés id et name. L’hypothèse, jusqu’à présent, est que le tableau de tags existe toujours pour chaque produit dans le conteneur. Toutefois, si nous supprimons cette hypothèse de base, nous pourrions avoir une situation dans laquelle un nouvel élément de produit est inséré dans le conteneur sans propriété tags, comme dans l’exemple suivant :
{
"id": "6374995F-9A78-43CD-AE0D-5F6041078140",
"categoryid": "3E4CEACD-D007-46EB-82D7-31F6141752B2",
"sku": "FR-R38R-60",
"name": "LL Road Frame - Red, 60",
"price": 337.22
}
Tout d’abord, nous pouvons utiliser la fonction intégrée IS_DEFINED pour vérifier si la propriété IS_DEFINED existe réellement dans cet élément :
SELECT
IS_DEFINED(p.tags) AS tags_exist
FROM
products p
[
{
"tags_exist": false
}
]
Supposons que la propriété tags existe, mais qu’il ne s’agisse pas d’un tableau, mais d’un autre type de propriété :
{
"id": "6374995F-9A78-43CD-AE0D-5F6041078140",
"categoryid": "3E4CEACD-D007-46EB-82D7-31F6141752B2",
"sku": "FR-R38R-60",
"name": "LL Road Frame - Red, 60",
"price": 337.22,
"tags": "fun, sporty, rad"
}
Nous pouvons utiliser la fonction intégrée IS_ARRAY pour vérifier si la propriété tags est un tableau :
SELECT
IS_ARRAY(p.tags) AS tags_is_array
FROM
products p
Nous pouvons également vérifier si la propriété tags est null ou n’utilise pas la fonction intégrée IS_NULL :
SELECT
IS_NULL(p.tags) AS tags_is_null
FROM
products p
Il existe encore plus de fonctions intégrées pour d’autres scénarios impliquant d’autres types de données.
Par exemple, envisagez une situation où différents stockages de données conservent les informations de tarification de manière incohérente. Certaines informations de tarification sont conservées sous forme de chaînes, tandis que d’autres sous forme de valeurs numériques. La fonction IS_NUMBER intégrée peut être utilisée dans une expression WHERE de nos requêtes :
SELECT
p.id,
p.price,
(p.price * 1.25) AS priceWithTax
FROM
products p
WHERE
IS_NUMBER(p.price)
Nous pourrions également utiliser la fonction IS_STRING intégrée pour voir si notre prix est une chaîne et ne pas appliquer de mise en forme :
SELECT
p.id,
p.price
FROM
products p
WHERE
IS_STRING(p.price)
Il existe d’autres fonctions intégrées de contrôle de type, y compris IS_OBJECT et IS_BOOLEAN.