Bekerja dengan JSON di Azure Cosmos DB untuk NoSQL

BERLAKU UNTUK: NoSQL

Di Azure Cosmos DB untuk NoSQL, item disimpan sebagai JSON. Sistem jenis dan ekspresi dibatasi hanya untuk menangani jenis JSON. Untuk informasi selengkapnya, lihat spesifikasi JSON.

Kami merangkum beberapa aspek penting dalam bekerja dengan JSON:

  • Objek JavaScript Object Notation selalu dimulai dengan penjepit { kiri dan diakhiri dengan penjepit } kanan
  • Anda dapat memiliki properti JavaScript Object Notation yang berlapis dalam satu sama lain
  • Nilai properti JavaScript Object Notation bisa menjadi array
  • Nama properti JavaScript Object Notation peka huruf besar/kecil
  • Nama properti JavaScript Object Notation bisa menjadi nilai string apa pun (termasuk spasi atau karakter yang bukan huruf)

Properti berlapis

Anda dapat mengakses JSON berlapis menggunakan pengaktor titik (.). Anda dapat menggunakan properti JavaScript Object Notation berlapis dalam kueri Anda dengan cara yang sama seperti Anda dapat menggunakan properti lain.

Berikut adalah dokumen dengan JavaScript Object Notation berlapis:

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

Dalam hal ini, sku ,colors, dan sizes properti semuanya berlapis di dalam metadata properti. Properti name ini juga berlapis di manufacturer dalam properti .

Contoh pertama ini memproyeksikan dua properti berlapis.

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

Bekerja dengan array

Selain properti berlapis, JavaScript Object Notation juga mendukung array. Saat bekerja dengan array, Anda dapat mengakses elemen tertentu dalam array dengan mereferensikan posisinya.

Contoh ini mengakses elemen array pada posisi tertentu.

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

Namun, dalam kebanyakan kasus, Anda menggunakan subkueri atau gabungan mandiri saat bekerja dengan array.

Misalnya, berikut adalah kueri yang mengembalikan beberapa permutasi menggunakan nilai array potensial dan gabungan silang,

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

Sebagai contoh lain, kueri juga dapat digunakan EXISTS dengan subkueri.

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

Perbedaan antara null dan tidak terdefinisi

Jika properti tidak ditentukan dalam item, maka nilainya adalah undefined. Properti dengan nilai null harus didefinisikan secara eksplisit dan diberi null nilai.

Azure Cosmos DB for NoSQL mendukung dua fungsi sistem pemeriksaan jenis yang bermanfaat untuk null properti dan undefined :

  • IS_NULL - memeriksa apakah nilai properti adalah null.
  • IS_DEFINED - memeriksa apakah nilai properti ditentukan atau undefined.

Berikut adalah contoh kueri yang memeriksa dua bidang pada setiap item dalam kontainer.

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

Untuk informasi selengkapnya tentang operator umum dan perilakunya untuk null nilai dan undefined , lihat operator persamaan dan perbandingan.

Kata kunci yang dipesan dan karakter khusus di JavaScript Object Notation

Anda dapat mengakses properti menggunakan operator properti yang dikutip []. Misalnya, SELECT c.grade dan SELECT c["grade"]setara. Sintaks ini berguna untuk melarikan diri dari properti yang berisi spasi, karakter khusus, atau memiliki nama yang sama dengan kata kunci SQL atau kata yang dipesan.

Misalnya, berikut adalah kueri yang mereferensikan properti dengan beberapa cara berbeda.

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

Ekspresi JSON

Proyeksi kueri mendukung ekspresi dan sintaks JSON.

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

Dalam contoh ini, SELECT klausul membuat objek JSON. Karena sampel tidak menyediakan kunci, klausul menggunakan nama $<index-number>variabel argumen implisit .

Contoh ini secara eksplisit menamai bidang yang sama.

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

Atau, kueri dapat meratakan objek untuk menghindari penamaan bidang redundan.

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

Nilai alias

Anda dapat secara eksplisit membuat alias nilai dalam kueri. Jika kueri memiliki dua properti dengan nama yang sama, gunakan alias untuk mengganti nama salah satu atau kedua properti agar tidak ambigu dalam hasil yang diproyeksikan.

Contoh

Kata AS kunci yang digunakan untuk alias bersifat opsional, seperti yang ditunjukkan dalam contoh berikut.

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

Nilai alias dengan kata kunci khusus atau karakter khusus

Anda tidak dapat menggunakan alias untuk memproyeksikan nilai sebagai nama properti dengan spasi, karakter khusus, atau kata yang dipesan. Jika Anda ingin mengubah proyeksi nilai menjadi, misalnya, memiliki nama properti dengan spasi, Anda bisa menggunakan ekspresi JSON.

Berikut contohnya:

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