Oscampos objecto, introduzidos com 4D v15, permitem armazenar e indexar dados não estruturados. Este pode ser um conjunto comum de dados, como nome, apelido, aniversário. Podem ser dados diferentes em cada registo, tais como uma loja que precisará de atributos diferentes para sapatos (tamanho, cor), computadores (CPU, memória), impressoras (cor, tinta), uma lista de valores ou tudo em qualquer combinação.
Aqui está uma verdadeira História de Utilizador de um cliente 4D :
“Aminha aplicação de crachá gere os direitos de acesso de cada pessoa a um edifício e a um espaço de tempo. Esta informação é armazenada numa base de dados como um conjunto de objectos ( por exemplo: {direito de acesso, edifício, faixa horária} ). Quero poder procurar pessoas que tenham acesso a um edifício durante um espaço de tempo”.
4D fornece várias formas de consulta de dados, usando índice e de forma extremamente rápida.
4D v16 R2 irá melhorar ainda mais o conjunto de funcionalidades, permitindo consultas ainda mais complexas dentro de uma lista de elementos num único objecto. Ao pesquisar em atributos de matriz com múltiplos argumentos de consulta unidos pelo operador AND, pode optar por obter os registos onde:
- os argumentos de correspondência estão em pelo menos um elemento
- os argumentos correspondentes estão no mesmo elemento (novo)
Exemplo
Vejamos um exemplo com os dois registos seguintes:
{ "name":"martin", "locations": [ { "kind":"home", "city":"paris" } ] } , { "name":"smith", "locations": [ { "kind":"home", "city":"lyon" }, { "kind":"office", "city":"paris" } ] }
Quer encontrar pessoas com uma localização do tipo “casa ” na cidade “paris”.
Os argumentos de correspondência estão em pelo menos um elemento
Se escrever:
QUERY BY ATTRIBUTE([People];[People]OB_Field; "locations[].type";=; "home";*)
QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field; "locations[].city";=; "paris")
A consulta retorna “martin“ e “ferreiro“ porque “ferreiro“ tem um elemento “locais” cujo “tipo“ é“casa“ e cuja “cidade“ é “paris“, mesmo que não seja o mesmo elemento.
Os argumentos de correspondência estão no mesmo elemento
Se escrever:
QUERY BY ATTRIBUTE([People];[People]OB_Field; "locations[a].type";=; "home";*)
QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field; "locations[a].city";=; "paris")
A consulta retorna “martin“ porque tem um elemento “locais“ cujo “tipo ” é “casa ” e cuja “cidade ” é “paris“. A consulta não retorna “smith“ porque o valor “home ” e “paris“ não estão no mesmo elemento de matriz.
Se quiser obter apenas registos em que os argumentos correspondentes estejam no mesmo elemento, precisa de utilizar argumentos ligados. Para ligar argumentos de consulta adicione uma letra entre os [ ] no primeiro caminho para ligar e repita a mesma letra em todos os argumentos ligados.
Por exemplo: localizações[a].cidade e localizações[a].tipo. Para adicionar diferentes critérios ligados na mesma consulta, utilizar outra letra. Pode descarregar a seguinte base de dados de exemplos para ver mais exemplos.
Pode também consultar a documentação 4D v16 R2 para mais detalhes: