Getting started with queries (Introdução às consultas)

APLICA-SE A: NoSQL

No Azure Cosmos DB para contas NoSQL, existem duas formas de ler dados:

  • Leituras de pontos
    • Pode fazer uma pesquisa de chave/valor num único ID de item e chave de partição. O ID do item e a combinação da chave de partição são a chave e o item em si é o valor. Para um documento de 1 KB, as leituras de pontos normalmente custam uma unidade de pedido com uma latência inferior a 10 ms. As leituras de pontos devolvem um único item inteiro, não um item parcial ou um campo específico.
    • Eis alguns exemplos de como fazer leituras de pontos com cada SDK:
  • Consultas
    • Pode consultar dados ao escrever consultas com o linguagem SQL (Structured Query Language) (SQL) como uma linguagem de consulta JSON. As consultas custam sempre, pelo menos, 2,3 unidades de pedido e, em geral, têm uma latência mais elevada e mais variável do que as leituras de pontos. As consultas podem devolver muitos itens.
    • A maioria das cargas de trabalho de leitura intensiva no Azure Cosmos DB utilizam uma combinação de leituras e consultas de pontos. Se apenas precisar de ler um único item, as leituras de pontos são mais baratas e rápidas do que as consultas. As leituras de pontos não precisam de utilizar o motor de consulta para aceder aos dados e podem ler os dados diretamente. Não é possível que todas as cargas de trabalho leiam exclusivamente dados através de leituras de pontos, pelo que o suporte de uma linguagem de consulta personalizada e de indexação agnóstica de esquema proporcionam uma forma mais flexível de aceder aos seus dados.
    • Eis alguns exemplos de como fazer consultas com cada SDK:

O resto deste artigo mostra como começar a escrever consultas no Azure Cosmos DB. as consultas podem ser executadas através do SDK ou do portal do Azure.

Carregar dados de exemplo

Na sua API para a conta do Azure Cosmos DB no NoSQL, utilize o Data Explorer para criar um contentor chamado products. Depois de o contentor ser criado, utilize o browser de estruturas de dados para expandir o products contentor. Por fim, selecione Itens.

A barra de menus deverá agora ter a opção Novo Item . Utilize esta opção para criar os itens JSON neste artigo.

Dica

Para este guia rápido, pode utilizar /id como chave de partição. Para um contentor do mundo real, deve considerar a carga de trabalho geral ao selecionar uma estratégia de chave de partição. Para obter mais informações, veja criação de partições e dimensionamento horizontal.

Criar itens JSON

Estes dois itens JSON representam dois produtos de exemplo da AdventureWorks. Incluem informações sobre o produto, o fabricante e as etiquetas de metadados. Cada item inclui propriedades aninhadas, matrizes, cadeias, números, dados GeoJSON e booleanos.

O primeiro item tem cadeias, números, booleanos, matrizes e propriedades aninhadas:

{
  "id": "863e778d-21c9-4e2a-a984-d31f947c665c",
  "categoryName": "Surfboards",
  "name": "Teapo Surfboard (6'10\") Grape",
  "sku": "teapo-surfboard-72109",
  "price": 690.00,
  "manufacturer": {
    "name": "Taepo",
    "location": {
      "type": "Point",
      "coordinates": [ 
        34.15562788533047, -118.4633004882891
      ]
    }
  },
  "tags": [
    { "name": "Tail Shape: Swallow" },
    { "name": "Color Group: Purple" }
  ]
}

O segundo item inclui um conjunto de campos diferente do primeiro item:

{
  "id": "6e9f51c1-6b45-440f-af5a-2abc96cd083d",
  "categoryName": "Sleeping Bags",
  "name": "Vareno Sleeping Bag (6') Turmeric",
  "price": 120.00,
  "closeout": true,
  "manufacturer": {
    "name": "Vareno"
  },
  "tags": [
    { "name": "Color Group: Yellow" },
    { "name": "Bag Shape: Mummy" }
  ]
}

Consultar os itens JSON

Para compreender alguns dos principais aspetos da API para a linguagem de consulta noSQL, é útil experimentar algumas consultas de exemplo.

  • Esta primeira consulta devolve simplesmente todo o item JSON para cada item no contentor. O identificador products neste exemplo é arbitrário e pode utilizar qualquer nome para referenciar o contentor.

    SELECT *
    FROM products
    

    Os resultados da consulta são:

    [
      {
        "id": "863e778d-21c9-4e2a-a984-d31f947c665c",
        "categoryName": "Surfboards",
        "name": "Teapo Surfboard (6'10\") Grape",
        "sku": "teapo-surfboard-72109",
        "price": 690,
        "manufacturer": {
          "name": "Taepo",
          "location": {
            "type": "Point",
            "coordinates": [
              34.15562788533047, -118.4633004882891
            ]
          }
        },
        "tags": [
          { "name": "Tail Shape: Swallow" },
          { "name": "Color Group: Purple" }
        ]
      },
      {
        "id": "6e9f51c1-6b45-440f-af5a-2abc96cd083d",
        "categoryName": "Sleeping Bags",
        "name": "Vareno Sleeping Bag (6') Turmeric",
        "price": 120,
        "closeout": true,
        "manufacturer": {
          "name": "Vareno"
        },
        "tags": [
          { "name": "Color Group: Yellow" },
          { "name": "Bag Shape: Mummy" }
        ]
      }
    ]
    

    Nota

    Normalmente, os itens JSON incluem campos adicionais geridos pelo Azure Cosmos DB. Estes campos incluem, mas não estão limitados a:

    • _rid
    • _self
    • _etag
    • _ts

    Para este artigo, estes campos são removidos para tornar a saída mais curta e fácil de compreender.

  • Esta consulta devolve os itens em que o categoryName campo corresponde Sleeping Bagsa . Uma vez que se trata de uma SELECT * consulta, o resultado da consulta é o item JSON completo. Para obter mais informações sobre SELECT sintaxe, consulte SELECT a instrução. Esta consulta também utiliza o alias mais curto p para o contentor.

    SELECT *
    FROM products p
    WHERE p.categoryName = "Sleeping Bags"
    

    Os resultados da consulta são:

    [
      {
        "id": "6e9f51c1-6b45-440f-af5a-2abc96cd083d",
        "categoryName": "Sleeping Bags",
        "name": "Vareno Sleeping Bag (6') Turmeric",
        "price": 120,
        "closeout": true,
        "manufacturer": {
          "name": "Vareno"
        },
        "tags": [
          { "name": "Color Group: Yellow" },
          { "name": "Bag Shape: Mummy" }
        ]
      }
    ]
    
  • Esta consulta seguinte utiliza um filtro diferente e, em seguida, reformata a saída JSON para uma forma diferente. A consulta projeta um novo objeto JSON com três campos: namee manufacturer.namesku. Este exemplo utiliza vários aliases, incluindo product e vendor para reformular o objeto de saída num formato que a nossa aplicação pode utilizar.

    SELECT {
      "name": p.name,
      "sku": p.sku,
      "vendor": p.manufacturer.name
    } AS product
    FROM products p
    WHERE p.sku = "teapo-surfboard-72109"
    

    Os resultados da consulta são:

    [
      {
        "product": {
          "name": "Teapo Surfboard (6'10\") Grape",
          "sku": "teapo-surfboard-72109",
          "vendor": "Taepo"
        }
      }
    ]
    
  • Também pode aplanar os resultados JSON personalizados com SELECT VALUE.

    SELECT VALUE {
      "name": p.name,
      "sku": p.sku,
      "vendor": p.manufacturer.name
    }
    FROM products p
    WHERE p.sku = "teapo-surfboard-72109"
    

    Os resultados da consulta são:

    [
      {
        "name": "Teapo Surfboard (6'10\") Grape",
        "sku": "teapo-surfboard-72109",
        "vendor": "Taepo"
      }
    ]
    
  • Por fim, esta última consulta devolve todas as etiquetas com a JOIN palavra-chave. Para obter mais informações, consulte JOIN a palavra-chave. Esta consulta só devolve palavras-chave para produtos fabricados pelo Taepo.

    SELECT t.name
    FROM products p
    JOIN t in p.tags
    WHERE p.manufacturer.name = "Taepo"
    

    Os resultados são:

    [
      { "name": "Tail Shape: Swallow" },
      { "name": "Color Group: Purple" }
    ]
    

Concluir

Os exemplos neste artigo mostram vários aspetos da linguagem de consulta do Azure Cosmos DB:

  • A API para NoSQL funciona em valores JSON. A API lida com entidades em forma de árvore em vez de linhas e colunas. Pode consultar os nós de árvore em qualquer profundidade arbitrária, como Node1.Node2.Node3…..Nodem, semelhante à referência de duas partes de <table>.<column> no SQL anSI.
  • Uma vez que a linguagem de consulta funciona com dados sem esquema, o sistema de tipo tem de estar vinculado dinamicamente. A mesma expressão pode produzir diferentes tipos em itens diferentes. O resultado de uma consulta é um valor JSON válido, mas não é garantido que seja de um esquema fixo.
  • O Azure Cosmos DB suporta apenas itens JSON rigorosos. O sistema de tipos e as expressões são restringidos para processar apenas os tipos JSON. Para obter mais informações, veja a especificação JSON.
  • Um contentor é uma coleção sem esquema de itens JSON. A contenção captura implicitamente relações dentro e entre itens de contentor, não por chave primária e relações de chave externa. Esta funcionalidade é importante para as associações intra item. Para obter mais informações, consulte JOIN a palavra-chave.

Passos seguintes