CosmosDB: Query, SubQuery & JOIN

Lo scorso mese avevo scritto l’articolo CosmosDB: string array e WHERE condition dove spiegavo come sfruttare/ utilizzare ARRAY_CONTAINS in CosmosDB. Oggi desidero mostrarvi come aggirare eventuali problemi che si possono riscontrare con esso.

Caso Pratico

Prima di entrare nel vivo del contenuto voglio raccontarvi la situazione -reale- che mi ha fatto venire in mente questo articolo. Riprendiamo il documento proposto la volta scorsa per rinfrescare la memoria.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
    "Id": "390448f3-589b-411f-b806-6bc59595eb80",
    "Items": [
        {
            "id": "dc0025f1-11ad-4978-bec4-a57c275ba64c"
        },
        {
            "id": "5afc575c-2e58-4210-9f7b-719ed4bcbc78"
        },
        {
            "id": "876267a2-b2c5-4ba8-b6fb-f388d341d91d"
        }
    ]
}

Come descritto nel precedente articolo, la soluzione ideale per cercare tramite il valore di id sarebbe il seguente

1
ARRAY_CONTAINS(c.Items, {id: 'dc0025f1-11ad-4978-bec4-a57c275ba64c'})

pero’ vi voglio segnalare che non -sempre- funziona.

JOIN / SubQuery

Il problema e’ molto semplice. Sfruttando ARRAY_CONTAINS siamo soggetti al case sensitive e non vi e’ modo (almeno, che io sappia) di sfruttare le soluzioni scritte nel post CosmosDB: effettuare una query LIKE.

Per applicare delle logiche di comparazione case insensitive in queste condizioni dovremmo semplicemente creare delle subquery all’interno del documento stesso.

Come? Ecco l’esempio pratico

1
2
3
4
5
SELECT c.Id
FROM c
    JOIN i IN c.Items
WHERE 
    UPPER(i.id) = UPPER('dc0025f1-11ad-4978-bec4-a57c275ba64c')

Semplice vero? A questo punto vi bastera’ proiettare i campi che vi serviranno nel DTO ed il gioco e’ fatto.