Aracılığıyla paylaş


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

UYGULANANLAR: 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 özetleriz:

  • JSON nesneleri her zaman bir { 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

İç içe JSON'a nokta (.) erişimci kullanarak 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 iç içe yerleştirilmiştir metadata . name Özelliği de özelliğin içinde iç içe yerleştirilmiştirmanufacturer.

Bu ilk örnek iki iç içe ö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

JSON, iç içe özelliklere ek olarak dizileri de destekler. Dizilerle çalışırken, dizinin 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ştirme kullanırsınız.

Örneğin, olası dizi değerlerini ve çapraz birleştirmeyi kullanarak birden çok permütasyon döndüren bir sorgu aşağıda 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 sorguyla da 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ımlanmamış 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 sistemi işlevini destekler:

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

Kapsayıcıdaki her öğede iki alanı denetleyebilen örnek bir sorgu aşağıda 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 davranışları ve undefined değerleri 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

Teklif edilen özellik işlecini []kullanarak özelliklere erişebilirsiniz. Örneğin ve SELECT c.grade SELECT 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çmak için kullanışlıdır.

Örneğin, bir özelliğe birkaç farklı şekilde 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 SELECT tümcesi 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ıran bir örnektir.

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, yedekli 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. Sorgu aynı ada sahip iki özelliğe sahipse, diğer ad kullanarak özelliklerin birini veya her ikisini de yeniden adlandırarak öngörülen sonuçta belirsiz olmasını sağlayın.

Örnekler

Diğer AS ad için kullanılan anahtar sözcük, aşağıdaki örnekte gösterildiği gibi 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 istiyorsanız, JSON ifadesi kullanabilirsiniz.

Bir örnek aşağıda 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"
  }
]