العمل مع JSON في Azure Cosmos DB ل NoSQL

ينطبق على: NoSQL

في Azure Cosmos DB ل NoSQL، يتم تخزين العناصر ك JSON. يقتصر نظام الكتابة والتعبيرات على التعامل مع أنواع JSON فقط. لمزيد من المعلومات، راجع مواصفات JSON.

نلخص بعض الجوانب المهمة للعمل مع JSON:

  • تبدأ عناصر JSON دائما { بقوس أيسر وتنتهي } بقوس أيمن
  • يمكنك الحصول على خصائص JSON المتداخلة داخل بعضها
  • يمكن أن تكون قيم خاصية JSON مصفوفات
  • أسماء خصائص JSON حساسة في حالة الأحرف
  • يمكن أن يكون اسم خاصية JSON أي قيمة سلسلة (بما في ذلك المسافات أو الأحرف التي ليست أحرفًا)

الخصائص المتداخلة

يمكنك الوصول إلى JSON المتداخل باستخدام ملحق نقطة (.). يمكنك استخدام خصائص JSON المتداخلة في الاستعلامات بنفس الطريقة التي يمكنك استخدام بها أي خصائص أخرى.

فيما يلي مستند مع JSON المتداخلة:

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

في هذه الحالة، sku، وcolors وsizes يتم تداخل جميع الخصائص داخل الخاصيةmetadata. كما name أن الخاصية متداخلة داخل الخاصية manufacturer .

يعرض هذا المثال الأول خاصيتين متداخلتين.

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

العمل مع المصفوفات

بالإضافة إلى الخصائص المتداخلة، يدعم JSON أيضًا المصفوفات. عند العمل مع الصفائف، يمكنك الوصول إلى عنصر معين داخل الصفيف عن طريق الرجوع إلى موضعه.

يصل هذا المثال إلى عنصر صفيف في موضع معين.

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

ومع ذلك، في معظم الحالات، يمكنك استخدام استعلام فرعي أو صلة ذاتية عند العمل مع الصفائف.

على سبيل المثال، إليك استعلام يقوم بإرجاع تباديل متعددة باستخدام قيم الصفيف المحتملة وربط متقاطع،

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

كمثال آخر، يمكن أن يستخدم 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"
]

الفرق بين خالٍ وغير معرف

إذا لم يتم تعريف خاصية في عنصر، فإن قيمتها هي undefined. يجب تعريف الخاصية ذات القيمة null بشكل مُحدد وتعيين null قيمة.

يدعم Azure Cosmos DB ل NoSQL اثنين من وظائف نظام التحقق من النوع المفيدة ل null وخصائص undefined :

  • IS_NULL - يتحقق ما إذا كانت قيمة الخاصية هي null.
  • IS_DEFINED - يتحقق من تحديد قيمة خاصية أو undefined.

فيما يلي مثال استعلام يتحقق من وجود حقلين على كل عنصر في الحاوية.

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

لمزيد من المعلومات حول عوامل التشغيل الشائعة وسلوكها ل null undefined وقيمها، راجع عوامل تشغيل المساواة والمقارنة.

الكلمات الأساسية المحفوظة والأحرف الخاصة في JSON

يمكنك الوصول إلى الخصائص باستخدام عامل تشغيل الخاصية المعروض []. على سبيل المثال، SELECT c.gradeوSELECT c["grade"] مكافئان. بناء الجملة هذا مفيد للهروب وهي خاصية تحتوي على مسافات أو أحرف خاصة أو لها نفس الاسم ككلمة أساسية في لغة الاستعلامات المركبة أو الكلمة المحفوظة.

على سبيل المثال، إليك استعلام يشير إلى خاصية بعدة طرق مميزة.

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

يدعم إسقاط الاستعلام تعبيرات JSON وبناء الجملة.

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

في هذا المثال، تقوم العبارة SELECT بإنشاء كائن JSON. نظرا لأن النموذج لا يوفر مفتاحا، تستخدم العبارة اسم $<index-number>متغير الوسيطة الضمني .

يسمي هذا المثال الحقل نفسه بشكل صريح.

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

بدلا من ذلك، يمكن للاستعلام تسوية الكائن لتجنب تسمية حقل زائد عن الحاجة.

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

قيم الاسم المستعار

يمكنك استخدام الاسم المستعار للقيم في الاستعلامات بوضوح. إذا كان الاستعلام يحتوي على خاصيتين بنفس الاسم، استخدم الاسم المستعار لإعادة تسمية أحد الخصائص أو كليهما بحيث يتم توضيحهما في النتيجة المتوقعة.

الأمثلة

AS الكلمة الأساسية المستخدمة في الاسم المستعار اختيارية، كما هو موضح في المثال التالي.

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

قيم الاسم المستعار مع كلمات أساسية محجوزة أو أحرف خاصة

لا يمكنك استخدام الاسم المستعار لإسقاط قيمة كاسم خاصية مع مسافة أو حرف خاص أو كلمة محفوظة. إذا أردت تغيير إسقاط قيمة ما، على سبيل المثال، إلي اسم خاصية مع مسافة، يمكنك استخدام تعبير JSON.

إليك مثال:

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