Adicionar código JavaScript para trabalhar com o Cosmos DB
Nesta unidade, você aprenderá a usar palavras-chave SQL, como LIKE, JOIN e WHERE para consultar dados com o Cosmos SDK.
Operações de consulta no contêiner
As operações de consulta são específicas para o contêiner. Como a consulta é executada no próprio contêiner, não é necessário usar o nome correto do contêiner, como products
. Na documentação de referência do SDK ou no portal, você pode ver o nome do contêiner como root
ou c
para indicar o contêiner.
Consultar todos os documentos
Para localizar documentos no contêiner de um banco de dados Cosmos DB Core (SQL), use o método de consulta SDK no objeto de contêiner, com uma especificação de consulta . A especificação da consulta requer a query
propriedade e uma propriedade option parameters
.
Propriedade | Objetivo |
---|---|
consulta (obrigatório) | O texto da consulta SQL. Uma consulta simples é select * from products . |
parâmetros (opcional) | Substituição de variáveis na consulta. O nome corresponde ao nome usado na consulta e o valor é a substituição real. Você pode fornecer até 10 parâmetros. |
const querySpecification = {
query: `select * from products`,
parameters: undefined
};
Essa consulta retorna todos os documentos no contêiner.
Consulta de documentos por nome usando LIKE em um contêiner
Para refinar a pesquisa, mas ainda assim fornecer alguma flexibilidade, use a palavra-chave LIKE para permitir quaisquer correspondências na propriedade do documento onde a propriedade name do documento inclui o valor Blue. O nome pode começar com Azul, terminar com Azul ou ter Azul no meio porque o valor é encapsulado com os sinais de porcentagem, %
.
// SQL Query specification
const querySpec = {
// SQL query text using LIKE keyword and parameter
query: `select * from products p where p.name LIKE @propertyValue`,
// Optional SQL parameters, to be used in query
parameters: [
{
// name of property to find in query text
name: "@propertyValue",
// value to insert in place of property
value: `%Blue%`,
}
]
};
Usando a palavra-chave LIKE
Execute a consulta no contêiner para buscar os documentos. Os resultados da consulta são buscados e retornados fetchAll
na propriedade desestruturada, resources
.
// Execute query
const { resources } = await container.items.query(querySpec).fetchAll();
Ele itera ao longo de toda a coleção, use o loop for/of.
let i = 0;
// Show results of query
for (const item of resources) {
console.log(`${++i}: ${item.id}: ${item.name}, ${item.sku}`);
}
A saída é semelhante ao seguinte.
1: 08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2: Touring-1000 Blue, 50, BK-T79U-50
2: 2C981511-AC73-4A65-9DA3-A0577E386394: Touring-1000 Blue, 46, BK-T79U-46
3: 44873725-7B3B-4B28-804D-963D2D62E761: Touring-1000 Blue, 60, BK-T79U-60
4: 4E4B38CB-0D82-43E5-89AF-20270CD28A04: Touring-2000 Blue, 60, BK-T44U-60
5: 5308BAE7-B0CB-4883-9A93-192CB10DC94F: Touring-3000 Blue, 44, BK-T18U-44
Consulta de documentos por propriedade de cadeia de caracteres usando LIKE em um contêiner
Para tornar a consulta mais flexível, envolva-a em uma função que usa a propriedade de um documento e seu valor para localizar.
// Find all products that match a property with a value like `value`
async function executeSqlFind(property, value) {
// Build query
const querySpec = {
query: `select * from products p where p.${property} LIKE @propertyValue`,
parameters: [
{
name: "@propertyValue",
value: `${value}`,
},
],
};
// Show query
console.log(querySpec);
// Get results
const { resources } = await container.items.query(querySpec).fetchAll();
let i = 0;
// Show results of query
for (const item of resources) {
console.log(`${++i}: ${item.id}: ${item.name}, ${item.sku}`);
}
}
A propriedade e o valor são passados para a função e usados na consulta de valores de cadeia de caracteres.
Consultar documentos e retornar subpropriedade de inventário usando a palavra-chave JOIN em um contêiner
A forma do documento inclui duas subpropriedades, tags e inventário. Para acessar essas subpropriedades, use a palavra-chave JOIN. A consulta SQL a seguir foi formatada apenas para legibilidade e não precisa ser usada com o SDK do Cosmos DB.
SELECT
p.id,
p.name,
i.location,
i.inventory
FROM
products p
JOIN
inventory i IN p.inventory
WHERE
p.name LIKE '%Blue%'
AND
i.location='Dallas'
A variável de inventário, i
:
- É nomeado na cláusula JOIN para acessar os dados da subpropriedade.
- É usado na cláusula WHERE para reduzir o conjunto de dados.
- É usado na cláusula SELECT para retornar as propriedades do inventário.
Para encontrar todo o inventário de uma propriedade específica em um local específico, use a seguinte função. Ele usa a substituição de parâmetros para fornecer a propriedade de nível superior de um documento e o valor da subpropriedade a ser correspondido para um local.
async function executeSqlInventory(propertyName, propertyValue, locationPropertyName, locationPropertyValue) {
// Build query
const querySpec = {
query: `select p.id, p.name, i.location, i.inventory from products p JOIN i IN p.inventory where p.${propertyName} LIKE @propertyValue AND i.${locationPropertyName}=@locationPropertyValue`,
parameters: [
{
name: "@propertyValue",
value: `${propertyValue}`,
},
{
name: "@locationPropertyValue",
value: `${locationPropertyValue}` },
],
};
// Show query
console.log(querySpec);
// Get results
const { resources } = await container.items.query(querySpec).fetchAll();
let i = 0;
// Show results of query
console.log(`Looking for ${propertyName}=${propertyValue}, ${locationPropertyName}=${locationPropertyValue}`);
for (const item of resources) {
console.log(
`${++i}: ${item.id}: '${item.name}': current inventory = ${
item.inventory
}`
);
}
}
Esta função retorna saídas como:
Looking for name=%Blue%, location=Dallas
1: 08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2: 'Touring-1000 Blue, 50': current inventory = 42
2: 2C981511-AC73-4A65-9DA3-A0577E386394: 'Touring-1000 Blue, 46': current inventory = 12
3: 44873725-7B3B-4B28-804D-963D2D62E761: 'Touring-1000 Blue, 60': current inventory = 83
4: 4E4B38CB-0D82-43E5-89AF-20270CD28A04: 'Touring-2000 Blue, 60': current inventory = 90
5: 5308BAE7-B0CB-4883-9A93-192CB10DC94F: 'Touring-3000 Blue, 44': current inventory = 97
Upsert para inserir ou atualizar dados
O uso de um upsert ajuda a garantir que seus dados sejam adicionados se não existirem e atualizados se os dados existirem. O SDK do JavaScript retorna statusCode que significa qual ação foi executada:
Upsert statusCode | Significado |
---|---|
201 | Inserir |
200 | Atualização |
O JavaScript a seguir usa uma única função e o uso de container.items().upsert().
// Either insert or update item
async function upsert(item) {
// Process request
const result = await container.items.upsert(item);
if(result.statusCode===201){
console.log("Inserted data");
} else if (result.statusCode===200){
console.log("Updated data");
} else {
console.log(`unexpected statusCode ${result.statusCode}`);
}
}