Icampi oggetto, introdotti con 4D v15, consentono di memorizzare e indicizzare dati non strutturati. Potrebbe trattarsi di un insieme di dati comuni, come nome, cognome e compleanno. Potrebbero essere dati diversi per ogni record, come nel caso di un negozio che ha bisogno di attributi diversi per le scarpe (taglia, colore), i computer (CPU, memoria), le stampanti (colore, inchiostro), un elenco di valori o qualsiasi combinazione.
Ecco una vera User Story di un cliente 4D:
“La mia applicazione di badge gestisce i diritti di accesso di ogni persona a un edificio e per una fascia oraria. Queste informazioni sono memorizzate in un database come array di oggetti (ad esempio: {diritto di accesso, edificio, fascia oraria}). Voglio poter cercare le persone che hanno accesso a un edificio durante una fascia oraria”.
4D offre diversi modi per interrogare i dati, utilizzando indici e quindi in modo estremamente veloce.
4D v16 R2 migliorerà ulteriormente il set di funzionalità, consentendo query ancora più complesse all’interno di un elenco di elementi in un singolo oggetto. Quando si effettua una ricerca negli attributi di una matrice con più argomenti di query uniti dall’operatore AND, è possibile scegliere di ottenere i record in cui:
- gli argomenti corrispondenti sono in almeno un elemento
- gli argomenti corrispondenti sono nello stesso elemento (nuovo)
Esempio
Facciamo un esempio con i due record seguenti:
{ "name":"martin", "locations": [ { "kind":"home", "city":"paris" } ] } , { "name":"smith", "locations": [ { "kind":"home", "city":"lyon" }, { "kind":"office", "city":"paris" } ] }
Si vogliono trovare persone con un tipo di località “casa” nella città “paris”.
Gli argomenti corrispondenti sono in almeno un elemento
Se si scrive:
QUERY BY ATTRIBUTE([People];[People]OB_Field; "locations[].kind";=; "home";*)
QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field; "locations[].city";=; "paris")
La query restituisce “martin“ e “smith“ perché “smith“ ha un elemento “locations” il cui “kind“ è“home“ e la cui “city“ è “paris“, anche se non si tratta dello stesso elemento.
Gli argomenti corrispondenti sono nello stesso elemento
Se si scrive:
QUERY BY ATTRIBUTE([People];[People]OB_Field; "locations[a].kind";=; "home";*)
QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field; "locations[a].city";=; "paris")
La query restituisce “martin“ perché ha un elemento “locations“ il cui “tipo“ è “home“ e la cui “città“ è “paris“. La query non restituisce “smith“ perché i valori “home“ e “paris“ non sono nello stesso elemento dell’array.
Se si desidera ottenere solo i record in cui gli argomenti corrispondenti sono nello stesso elemento, è necessario utilizzare argomenti collegati. Per collegare gli argomenti della query, aggiungere una lettera tra i [ ] nel primo percorso da collegare e ripetere la stessa lettera in tutti gli argomenti collegati.
Ad esempio: località[a].città e località[a].tipo. Per aggiungere diversi criteri collegati nella stessa query, utilizzare un’altra lettera. È possibile scaricare il seguente database di esempio per vedere altri esempi.
Per ulteriori dettagli è possibile consultare la documentazione di 4D v16 R2: