NoSQL için Azure Cosmos DB'de JSON ile çalışma

ŞUNUN IÇIN GEÇERLIDIR: NoSQL

NoSQL için Azure Cosmos DB'de öğeler JSON olarak depolanır. Tür sistemi ve ifadeleri yalnızca JSON türleriyle çalışacak şekilde kısıtlanmıştır. Daha fazla bilgi için bkz. JSON belirtimi.

JSON ile çalışmanın bazı önemli yönlerini özetledik:

  • JSON nesneleri her zaman sol küme ayracı ile { başlar ve sağ küme ayracı ile } biter
  • İç içe JSON özelliklerine sahip olabilirsiniz
  • JSON özellik değerleri diziler olabilir
  • JSON özellik adları büyük/küçük harfe duyarlıdır
  • JSON özellik adı herhangi bir dize değeri olabilir (harf olmayan boşluklar veya karakterler dahil)

İç içe özellikler

nokta (.) erişimci kullanarak iç içe JSON'a erişebilirsiniz. sorgularınızda iç içe JSON özelliklerini, diğer özellikleri kullandığınız gibi kullanabilirsiniz.

İç içe JSON içeren bir belge aşağıdadır:

{
  "name": "Teapo rainbow surfboard",
  "manufacturer": {
    "name": "AdventureWorks"
  },
  "releaseDate": null,
  "metadata": {
    "sku": "72109",
    "colors": [
      "cruise",
      "picton-blue"
    ],
    "sizes": {
      "small": {
        "inches": 76,
        "feet": 6.33333
      },
      "large": {
        "inches": 92,
        "feet": 7.66667
      }
    }
  }
}

Bu durumda, sku, colorsve sizes özelliklerinin tümü özelliği içinde metadata iç içe yerleştirilmiştir. name özelliği de özelliğin içinde iç içe yerleştirilmiştirmanufacturer.

Bu ilk örnek, iç içe iki özelliği projelendirdi.

SELECT
    p.name,
    p.metadata.sku,
    p.sizes.small.inches AS size
FROM
    products p
[
  {
    "name": "Teapo rainbow surfboard",
    "sku": "72109"
  }
]

Dizilerle çalışma

İç içe özelliklere ek olarak, JSON dizileri de destekler. Dizilerle çalışırken, dizi içindeki belirli bir öğeye konumuna başvurarak erişebilirsiniz.

Bu örnek, belirli bir konumdaki bir dizi öğesine erişir.

SELECT
    p.name,
    p.metadata.colors
FROM
    products p
WHERE
    p.metadata.colors[0] NOT LIKE "%orange%"
[
  {
    "name": "Teapo rainbow surfboard",
    "colors": [
      "cruise",
      "picton-blue"
    ]
  }
]

Ancak çoğu durumda, dizilerle çalışırken bir alt sorgu veya kendi kendine birleşim kullanırsınız.

Örneğin, olası dizi değerlerini ve çapraz birleştirmeyi kullanarak birden çok permütasyon döndüren bir sorgu verilmiştir.

SELECT
    p.name,
    c AS color
FROM
    products p
JOIN
    c IN p.metadata.colors
[
  {
    "name": "Teapo rainbow surfboard",
    "color": "cruise"
  },
  {
    "name": "Teapo rainbow surfboard",
    "color": "picton-blue"
  }
]

Başka bir örnek olarak, sorgu bir alt sorgu ile de kullanılabilir EXISTS .

SELECT VALUE
    p.name
FROM
    products p
WHERE
    EXISTS (SELECT VALUE 
        c
    FROM
        c IN p.metadata.colors
    WHERE
        c LIKE "%picton%")
[
  "Teapo rainbow surfboard"
]

Null ile tanımsız arasındaki fark

Bir öğede bir özellik tanımlanmamışsa değeri olur undefined. Değeri null olan bir özellik açıkça tanımlanmalı ve bir null değer atanmalıdır.

NoSQL için Azure Cosmos DB, ve undefined özellikleri için null iki yararlı tür denetimi sistem işlevini destekler:

  • IS_NULL - bir özellik değerinin olup nullolmadığını denetler.
  • IS_DEFINED - bir özellik değerinin veya undefinedtanımlandığını denetler.

Aşağıda, kapsayıcıdaki her öğede iki alanı denetleyebilen örnek bir sorgu verilmiştir.

SELECT
    IS_NULL(p.releaseDate) AS isReleaseDateNull,
    IS_DEFINED(p.releaseDate) AS isReleaseDateDefined,
    IS_NULL(p.retirementDate) AS isRetirementDateNull,
    IS_DEFINED(p.retirementDate) AS isRetirementDateDefined
FROM
    products p
[
  {
    "isReleaseDateNull": true,
    "isReleaseDateDefined": true,
    "isRetirementDateNull": false,
    "isRetirementDateDefined": false
  }
]

Ortak işleçler ve bunların ve undefined değerlerine yönelik davranışları hakkında daha fazla bilgi için null bkz. eşitlik ve karşılaştırma işleçleri.

JSON'da ayrılmış anahtar sözcükler ve özel karakterler

Tırnak içine alınmış özellik işlecini []kullanarak özelliklere erişebilirsiniz. Örneğin ve SELECT c.gradeSELECT c["grade"] eşdeğerdir. Bu söz dizimi boşluklar, özel karakterler içeren veya SQL anahtar sözcüğü veya ayrılmış sözcükle aynı ada sahip bir özellikten kaçış yapmak için kullanışlıdır.

Örneğin, bir özelliğe birkaç farklı yoldan başvuran bir sorgu aşağıda verilmiştir.

SELECT
    p.manufacturer.name AS dotNotationReference,
    p["manufacturer"]["name"] AS bracketReference,
    p.manufacturer["name"] AS mixedReference
FROM
    products p
[
  {
    "dotNotationReference": "AdventureWorks",
    "bracketReference": "AdventureWorks",
    "mixedReference": "AdventureWorks"
  }
]

JSON ifadeleri

Sorgu projeksiyonu JSON ifadelerini ve söz dizimlerini destekler.

SELECT {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
    products p
[
  {
    "$1": {
      "productName": "Teapo rainbow surfboard",
      "largeSizeInFeet": 7.66667
    }
  }
]

Bu örnekte yan tümcesi SELECT bir JSON nesnesi oluşturur. Örnek anahtar sağlamadığından yan tümcesi örtük bağımsız değişken adını $<index-number>kullanır.

Bu örnek, aynı alanı açıkça adlandırın.

SELECT {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
} AS product
FROM
    products p
[
  {
    "product": {
      "productName": "Teapo rainbow surfboard",
      "largeSizeInFeet": 7.66667
    }
  }
]

Alternatif olarak, sorgu gereksiz bir alanın adlandırılmasını önlemek için nesneyi düzleştirebilir.

SELECT VALUE {
    "productName": p.name,
    "largeSizeInFeet": p.metadata.sizes.large.feet
}
FROM
    products p
[
  {
    "productName": "Teapo rainbow surfboard",
    "largeSizeInFeet": 7.66667
  }
]

Diğer ad değerleri

Sorgulardaki değerleri açıkça diğer ad olarak kullanabilirsiniz. Bir sorgunun aynı ada sahip iki özelliği varsa, öngörülen sonuçta belirsiz olmaları için özelliklerin birini veya her ikisini yeniden adlandırmak için diğer ad kullanın.

Örnekler

AS Aşağıdaki örnekte gösterildiği gibi diğer ad için kullanılan anahtar sözcük isteğe bağlıdır.

SELECT
    p.name,
    p.metadata.sku AS modelNumber
FROM
    products p
[
  {
    "name": "Teapo rainbow surfboard",
    "modelNumber": "72109"
  }
]

Ayrılmış anahtar sözcükler veya özel karakterler içeren diğer ad değerleri

Bir değeri boşluk, özel karakter veya ayrılmış sözcükle özellik adı olarak yansıtmak için diğer ad kullanamazsınız. Örneğin bir değerin yansıtmasını boşluklu bir özellik adıyla değiştirmek isterseniz JSON ifadesi kullanabilirsiniz.

Aşağıda bir örnek verilmiştir:

SELECT VALUE {
    "Product's name | ": p.name,
    "Model number => ": p.metadata.sku
}
FROM
    products p
[
  {
    "Product's name | ": "Teapo rainbow surfboard",
    "Model number => ": "72109"
  }
]