開始使用查詢

適用於:NoSQL

在 Azure Cosmos DB for NoSQL 帳戶中,讀取資料的方式有兩種:

  • 點讀取
    • 您可以在單一 專案識別碼 和資料分割索引鍵上執行索引鍵/值查閱。 項目識別碼和資料分割索引鍵組合是索引鍵,而項目本身是值。 如果是 1 KB 的檔,點讀取通常會花費一個 要求單位 ,延遲低於 10 毫秒。 點讀取傳回單一完整項目,而不是局部項目或特定欄位。
    • 以下是如何使用每個 SDK 來執行端點讀取的一些範例:
  • 查詢
    • 您可以使用結構化查詢語言 (SQL) (SQL) 作為 JSON 查詢語言來撰寫查詢,以查詢資料。 查詢一律至少需要 2.3 個要求單位,而且一般而言,具有比點讀取更高的變數延遲。 查詢可能會傳回許多項目。
    • Azure Cosmos DB 上的大部分大量讀取工作負載都會使用點讀取和查詢的組合。 如果您只需要讀取單一項目,則點讀取比查詢更便宜且更快速。 點讀取不需要使用查詢引擎來存取資料,且可以直接讀取資料。 所有工作負載都無法使用點讀取來獨佔讀取資料,因此支援自訂查詢語言和 無架構索引編制 可提供更有彈性的方式來存取您的資料。
    • 以下是如何使用每個 SDK 執行 查詢 的一些範例:

本文的其餘部分說明如何在 Azure Cosmos DB 中開始撰寫查詢。查詢可以透過 SDK 或Azure 入口網站來執行。

上傳範例資料

在您的適用于 NoSQL 的 API Azure Cosmos DB 帳戶中,使用Data Explorer建立名為 的 products 容器。 建立容器之後,請使用資料結構瀏覽器展開 products 容器。 最後,選取 [專案]。

功能表列現在應該有 [新增專案 ] 選項。 您可以使用此選項來建立本文中的 JSON 專案。

提示

針對此快速指南,您可以使用 /id 作為分割區索引鍵。 針對真實世界的容器,選取分割區索引鍵策略時,您應該考慮整體工作負載。 如需詳細資訊,請參閱 資料分割和水準調整

建立 JSON 項目

這兩個 JSON 專案代表 AdventureWorks中的兩個範例產品。 其中包括產品、其製造商和中繼資料標籤的相關資訊。 每個專案都包含巢狀屬性、陣列、字串、數位、GeoJSON 資料和布林值。

第一個項目包含字串、數字、布林值、陣列和巢狀屬性:

{
  "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" }
  ]
}

第二個專案包含一組與第一個專案不同的欄位:

{
  "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" }
  ]
}

查詢 JSON 項目

若要瞭解適用于 NoSQL 之 API 查詢語言的一些重要層面,請嘗試幾個範例查詢會很有用。

  • 第一個查詢只會傳回容器中每個專案的整個 JSON 專案。 此範例中的識別碼 products 是任意的,您可以使用任何名稱來參考您的容器。

    SELECT *
    FROM products
    

    查詢結果為:

    [
      {
        "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" }
        ]
      }
    ]
    

    注意

    JSON 專案通常包含由 Azure Cosmos DB 管理的其他欄位。 這些欄位包括但不限於:

    • _rid
    • _self
    • _etag
    • _ts

    在本文中,系統會移除這些欄位,讓輸出變得更短且更容易瞭解。

  • 此查詢會傳回欄位符合 Sleeping Bags 的專案 categoryName 。 因為這是 SELECT * 查詢,所以查詢的輸出會是完整的 JSON 項目。 如需語法的詳細資訊 SELECT ,請參閱SELECT 語句。 此查詢也會使用容器的較短 p 別名。

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

    查詢結果為:

    [
      {
        "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" }
        ]
      }
    ]
    
  • 下一個查詢會使用不同的篩選準則,然後將 JSON 輸出重新格式化為不同的圖形。 查詢會投影具有三個欄位的新 JSON 物件: namemanufacturer.namesku 。 此範例使用各種別名,包括 productvendor ,將輸出物件重新調整為應用程式可以使用的格式。

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

    查詢結果為:

    [
      {
        "product": {
          "name": "Teapo Surfboard (6'10\") Grape",
          "sku": "teapo-surfboard-72109",
          "vendor": "Taepo"
        }
      }
    ]
    
  • 您也可以使用 SELECT VALUE 來壓平合併自訂 JSON 結果。

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

    查詢結果為:

    [
      {
        "name": "Teapo Surfboard (6'10\") Grape",
        "sku": "teapo-surfboard-72109",
        "vendor": "Taepo"
      }
    ]
    
  • 最後,這個最後一個查詢會使用 JOIN 關鍵字傳回所有標記。 如需詳細資訊,請參閱JOIN 關鍵字。 此查詢只會傳回 所 Taepo 製造產品的關鍵字。

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

    結果如下:

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

總結

本文中的範例示範 Azure Cosmos DB 查詢語言的數個層面:

  • NoSQL 的 API 適用于 JSON 值。 API 會處理樹狀實體,而不是資料列和資料行。 您可以參考任何任意深度的樹狀節點,例如 Node1.Node2.Node3…..Nodem,類似於 ANSI SQL 中 <table>.<column> 的兩部分參考。
  • 因為查詢語言適用於無結構描述資料,所以類型系統必須動態地繫結。 相同的運算式可能會對不同的項目產生不同的類型。 查詢的結果會是有效的 JSON 值,但不保證會是固定的結構描述。
  • Azure Cosmos DB 只支援嚴謹的 JSON 項目。 類型系統和運算式僅限於處理 JSON 類型。 如需詳細資訊,請參閱 JSON 規格 \(英文\)。
  • 容器是無架構的 JSON 專案集合。 內含專案會隱含地擷取容器專案內和跨容器專案的關聯,而不是主鍵和外鍵關聯。 這項功能對於專案內聯結很重要。 如需詳細資訊,請參閱JOIN 關鍵字

下一步