ربط إخراج Azure Cosmos DB لوظائف Azure 2.x وأعلى
يتيح لك رابط إخراج Azure Cosmos DB كتابة مستند جديد في قاعدة بيانات Azure Cosmos DB باستخدام واجهة برمجة تطبيقات SQL.
للحصول على معلومات حول تفاصيل الإعداد والتكوين، راجع الاستعراض العام.
مثال
ما لم يذكر خلاف ذلك، تستهدف الأمثلة الواردة في هذه المقالة الإصدار 3.x من ملحق قاعدة بيانات Azure Cosmos. للاستخدام مع الإصدار الإضافي 4.x ، تحتاج إلى استبدال السلسلة collection في أسماء الخصائص والسمات ب container.
يحتوي هذا القسم على الأمثلة التالية:
- مشغل قائمة الانتظار، كتابة مستند واحد
- مشغل قائمة الانتظار، كتابة مستند واحد (ملحق v4)
- مشغل قائمة الانتظار، كتابة مستندات باستخدام IAsyncCollector
تشير الأمثلة إلى نوع ToDoItem بسيط:
namespace CosmosDBSamplesV2
{
public class ToDoItem
{
public string id { get; set; }
public string Description { get; set; }
}
}
مشغل قائمة الانتظار، كتابة مستند واحد
يظهر المثال التالي دالة C# التي تضيف مستندًا إلى قاعدة بيانات، باستخدام البيانات المتوفرة في رسالة من مخزن قائمة الانتظار.
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using System;
namespace CosmosDBSamplesV2
{
public static class WriteOneDoc
{
[FunctionName("WriteOneDoc")]
public static void Run(
[QueueTrigger("todoqueueforwrite")] string queueMessage,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")]out dynamic document,
ILogger log)
{
document = new { Description = queueMessage, id = Guid.NewGuid() };
log.LogInformation($"C# Queue trigger function inserted one row");
log.LogInformation($"Description={queueMessage}");
}
}
}
مشغل قائمة الانتظار، كتابة مستند واحد (ملحق v4)
التطبيقات التي تستخدم Cosmos DB إصدار 4.x للملحق أو أعلى سيكون لها خصائص سمات مختلفة والتي تظهر أدناه. يظهر المثال التالي دالة C# التي تضيف مستندًا إلى قاعدة بيانات، باستخدام البيانات المتوفرة في رسالة من مخزن قائمة الانتظار.
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using System;
namespace CosmosDBSamplesV2
{
public static class WriteOneDoc
{
[FunctionName("WriteOneDoc")]
public static void Run(
[QueueTrigger("todoqueueforwrite")] string queueMessage,
[CosmosDB(
databaseName: "ToDoItems",
containerName: "Items",
Connection = "CosmosDBConnection")]out dynamic document,
ILogger log)
{
document = new { Description = queueMessage, id = Guid.NewGuid() };
log.LogInformation($"C# Queue trigger function inserted one row");
log.LogInformation($"Description={queueMessage}");
}
}
}
مشغل قائمة الانتظار، كتابة مستندات باستخدام IAsyncCollector
يظهر المثال التالي دالة C# التي تضيف مستندًا إلى قاعدة بيانات، باستخدام البيانات المتوفرة في JSON رسالة قائمة الانتظار.
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
namespace CosmosDBSamplesV2
{
public static class WriteDocsIAsyncCollector
{
[FunctionName("WriteDocsIAsyncCollector")]
public static async Task Run(
[QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")]
IAsyncCollector<ToDoItem> toDoItemsOut,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");
foreach (ToDoItem toDoItem in toDoItemsIn)
{
log.LogInformation($"Description={toDoItem.Description}");
await toDoItemsOut.AddAsync(toDoItem);
}
}
}
}
يمكن إنشاء الدالة C # باستخدام أحد أوضاع C # التالية:
- مكتبة الفئة أثناء العملية: الدالة C# المترجمة التي يتم تشغيلها في نفس العملية مثل وقت تشغيل الوظائف.
- مكتبة فئة العملية المعزولة: الدالة C # المترجمة التي يتم تشغيلها في عملية معزولة عن وقت التشغيل. مطلوب عملية معزولة لدعم وظائف C # التي تعمل على .NET 5.0.
- البرنامج النصي C#: يستخدم بشكل أساسي عند إنشاء وظائف C# في مدخل Azure.
- قائمة انتظار المشغل، حفظ الرسالة إلى قاعدة البيانات عبر القيمة المرجعة
- مشغل HTTP، حفظ مستند واحد إلى قاعدة البيانات عبر القيمة المرجعة
- مشغل HTTP، حفظ مستند واحد إلى قاعدة البيانات عبر OutputBinding
- مشغل HTTP، حفظ مستندات متعددة إلى قاعدة البيانات عبر OutputBinding
قائمة انتظار المشغل، حفظ الرسالة إلى قاعدة البيانات عبر القيمة المرجعة
يظهر المثال التالي دالة Java التي تضيف مستندًا إلى قاعدة البيانات مع بيانات من رسالة في محزن قائمة الانتظار.
@FunctionName("getItem")
@CosmosDBOutput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
connectionStringSetting = "AzureCosmosDBConnection")
public String cosmosDbQueryById(
@QueueTrigger(name = "msg",
queueName = "myqueue-items",
connection = "AzureWebJobsStorage")
String message,
final ExecutionContext context) {
return "{ id: \"" + System.currentTimeMillis() + "\", Description: " + message + " }";
}
مشغل HTTP، حفظ مستند واحد إلى قاعدة البيانات عبر القيمة المرجعة
يظهر المثال التالي دالة Java التي تم توضيح توقيعها بـ @CosmosDBOutput بالقيمة المرجعة من نوع String. سيتم كتابة المستند JSON الذي تم إرجاعه بواسطة الدالة تلقائيًا إلى مجموعة CosmosDB المطابقة.
@FunctionName("WriteOneDoc")
@CosmosDBOutput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
connectionStringSetting = "Cosmos_DB_Connection_String")
public String run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
// Parse query parameter
String query = request.getQueryParameters().get("desc");
String name = request.getBody().orElse(query);
// Generate random ID
final int id = Math.abs(new Random().nextInt());
// Generate document
final String jsonDocument = "{\"id\":\"" + id + "\", " +
"\"description\": \"" + name + "\"}";
context.getLogger().info("Document to be saved: " + jsonDocument);
return jsonDocument;
}
مشغل HTTP، حفظ مستند واحد إلى قاعدة البيانات عبر OutputBinding
يظهر المثال التالي دالة Java التي تكتب مستند إلى CosmosDB عبر معلمة إخراج OutputBinding<T>. في هذا المثال، المعلمة outputItem يجب أن تكون موضحة بـ @CosmosDBOutput، وليس بتوقيع الدالة. يتيح استخدام OutputBinding<T> للدالة الاستفادة من الربط لكتابة المستند إلى CosmosDB بينما يسمح أيضًا بإرجاع قيمة مختلفة إلى مستدعي الدالة مثل مستند JSON أو XML.
@FunctionName("WriteOneDocOutputBinding")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@CosmosDBOutput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
connectionStringSetting = "Cosmos_DB_Connection_String")
OutputBinding<String> outputItem,
final ExecutionContext context) {
// Parse query parameter
String query = request.getQueryParameters().get("desc");
String name = request.getBody().orElse(query);
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
// Generate random ID
final int id = Math.abs(new Random().nextInt());
// Generate document
final String jsonDocument = "{\"id\":\"" + id + "\", " +
"\"description\": \"" + name + "\"}";
context.getLogger().info("Document to be saved: " + jsonDocument);
// Set outputItem's value to the JSON document to be saved
outputItem.setValue(jsonDocument);
// return a different document to the browser or calling client.
return request.createResponseBuilder(HttpStatus.OK)
.body("Document created successfully.")
.build();
}
مشغل HTTP، حفظ مستندات متعددة إلى قاعدة البيانات عبر OutputBinding
يظهر المثال التالي دالة Java التي تكتب مستندات متعددة إلى CosmosDB عبر معلمة إخراج OutputBinding<T>. في هذا المثال، المعلمة outputItem موضحة بـ @CosmosDBOutput، وليس بتوقيع الدالة. معلمة الإخراج، outputItem تحتوي على قائمة بالعناصر ToDoItem كنوع معلمة القالب الخاص بها. يتيح استخدام OutputBinding<T> للدالة الاستفادة من الربط لكتابة المستندات إلى CosmosDB بينما يسمح أيضًا بإرجاع قيمة مختلفة إلى مستدعي الدالة مثل مستند JSON أو XML.
@FunctionName("WriteMultipleDocsOutputBinding")
public HttpResponseMessage run(
@HttpTrigger(name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@CosmosDBOutput(name = "database",
databaseName = "ToDoList",
collectionName = "Items",
connectionStringSetting = "Cosmos_DB_Connection_String")
OutputBinding<List<ToDoItem>> outputItem,
final ExecutionContext context) {
// Parse query parameter
String query = request.getQueryParameters().get("desc");
String name = request.getBody().orElse(query);
// Item list
context.getLogger().info("Parameters are: " + request.getQueryParameters());
// Generate documents
List<ToDoItem> items = new ArrayList<>();
for (int i = 0; i < 5; i ++) {
// Generate random ID
final int id = Math.abs(new Random().nextInt());
// Create ToDoItem
ToDoItem item = new ToDoItem(String.valueOf(id), name);
items.add(item);
}
// Set outputItem's value to the list of POJOs to be saved
outputItem.setValue(items);
context.getLogger().info("Document to be saved: " + items);
// return a different document to the browser or calling client.
return request.createResponseBuilder(HttpStatus.OK)
.body("Documents created successfully.")
.build();
}
في مكتبة وقت تشغيل وظائف Java، استخدم التعليق التوضيحي @CosmosDBOutput على المعلمات التي سيتم كتابتها إلى Cosmos DB. يجب أن يكون نوع معلمة التعليق التوضيحي OutputBinding<T>، حيث T هو إما نوع Java أصلي أو POJO.
يظهر المثال التالي رابط إخراج Azure Cosmos DB في ملف function.json و دالة JavaScript التي تستخدم الرابط. تستخدم الدالة رابط إدخال قائمة انتظار لقائمة انتظار تتلقى JSON بالتنسيق التالي:
{
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
تقوم الدالة بإنشاء مستندات Azure Cosmos DB بالتنسيق التالي لكل سجل:
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
}
إليك بيانات الربط في ملف function.json:
{
"name": "employeeDocument",
"type": "cosmosDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"createIfNotExists": true,
"connectionStringSetting": "MyAccount_COSMOSDB",
"direction": "out"
}
يشرح قسم التكوين هذه الخصائص.
هنا رمز JavaScript:
module.exports = async function (context) {
context.bindings.employeeDocument = JSON.stringify({
id: context.bindings.myQueueItem.name + "-" + context.bindings.myQueueItem.employeeId,
name: context.bindings.myQueueItem.name,
employeeId: context.bindings.myQueueItem.employeeId,
address: context.bindings.myQueueItem.address
});
};
للعمليات المجمعة، قم بإدراج النموذج اللكائنات أولًا ثم قم بتشغيل دالة stringify. هنا رمز JavaScript:
module.exports = async function (context) {
context.bindings.employeeDocument = JSON.stringify([
{
"id": "John Henry-123456",
"name": "John Henry",
"employeeId": "123456",
"address": "A town nearby"
},
{
"id": "John Doe-123457",
"name": "John Doe",
"employeeId": "123457",
"address": "A town far away"
}]);
};
يوضح المثال التالي كيفية كتابة البيانات إلى Cosmos DB باستخدام ربط إخراج. يتم إعلان الربط في ملف تكوين الدالة (functions.json) وأخذ البيانات من رسالة قائمة انتظار والكتابة بمستند Cosmos DB.
{
"name": "EmployeeDocument",
"type": "cosmosDB",
"databaseName": "MyDatabase",
"collectionName": "MyCollection",
"createIfNotExists": true,
"connectionStringSetting": "MyStorageConnectionAppSetting",
"direction": "out"
}
في ملف run.ps1، العنصر الذي تم إرجاعه من الدالة يتم تعيينه إلى EmployeeDocument كائن، وهو ثابت في قاعدة البيانات.
param($QueueItem, $TriggerMetadata)
Push-OutputBinding -Name EmployeeDocument -Value @{
id = $QueueItem.name + '-' + $QueueItem.employeeId
name = $QueueItem.name
employeeId = $QueueItem.employeeId
address = $QueueItem.address
}
يوضح المثال التالي كيفية كتابة مستند إلى قاعدة بيانات Azure Cosmos DB كمخرج دالة.
يُعرف ربط بيانات Azure في function.js حيث يُعين type إلى cosmosDB.
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "cosmosDB",
"direction": "out",
"name": "doc",
"databaseName": "demodb",
"collectionName": "data",
"createIfNotExists": "true",
"connectionStringSetting": "AzureCosmosDBConnectionString"
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
للكتابة إلى قاعدة البيانات، قم بتمرير عنصر مستند إلى أسلوب set لمعلمة قاعدة البيانات.
import azure.functions as func
def main(req: func.HttpRequest, doc: func.Out[func.Document]) -> func.HttpResponse:
request_body = req.get_body()
doc.set(func.Document.from_json(request_body))
return 'OK'
السمات
تستخدم كل من مكتبات C# العملية قيد المعالجةوالعملية المعزولة سمات لتحديد الدالة. يستخدم البرنامج النصي C # بدلا من ذلك ملف تكوين function.json.
| خاصية السمة | الوصف |
|---|---|
| ConnectionStringSetting | اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بحساب Azure Cosmos DB الذي تتم مراقبته. لمزيد من المعلومات، راجع الاتصالات. |
| DatabaseName | اسم قاعدة بيانات Azure Cosmos DB مع المجموعة التي يتم مراقبتها. |
| CollectionName | اسم المجموعة التي تتم مراقبتها. |
| CreateIfNotExists | قيمة منطقية للإشارة إلى ما إذا كانت المجموعة قد تم إنشاؤها عند عدم وجودها أم لا. القيمة الافتراضية هي false لأنه يتم إنشاء مجموعات جديدة باستخدام معدل النقل المحجوز، والذي له آثار تكلفة. لمزيد من المعلومات، يُرجى الرجوع إلى صفحة التسعير. |
| PartitionKey | عندما تكون CreateIfNotExists صحيحة، يحدد مسار مفتاح القسم للمجموعة التي تم إنشاؤها. قد تتضمن معلمات الربط. |
| *المجموعةالإنتاجية | عندما تكون CreateIfNotExists صحيحة، فهي تحدد معدل نقل المجموعة التي تم إنشاؤها. |
| PreferredLocations | (اختياري) يعرف المواقع المفضلة (المناطق) لحسابات قاعدة البيانات المنسوخة جغرافيا في خدمة Azure Cosmos DB. يجب فصل القيم بفواصل. على سبيل المثال، East US,South Central US,North Europe. |
| UseMultipleWriteLocations | (اختياري) عند التعيين إلى جنبا إلى true جنب مع PreferredLocations، يدعم عمليات الكتابة متعددة المناطق في خدمة Azure Cosmos DB. |
تعليقات توضيحية
من مكتبة وقت تشغيل وظائف Java، استخدم التعليق التوضيحي على المعلمات @CosmosDBOutput التي تكتب إلى Azure Cosmos DB. يدعم التعليق التوضيحي الخصائص التالية:
تهيئة
يشرح الجدول التالي خصائص تكوين الربط التي قمت بتعيينها في الملف function.json ، حيث تختلف الخصائص حسب إصدار الملحق:
| خاصية function.json | الوصف |
|---|---|
| connectionStringSetting | اسم إعداد تطبيق أو مجموعة إعداد تحدد كيفية الاتصال بحساب Azure Cosmos DB الذي تتم مراقبته. لمزيد من المعلومات، راجع الاتصالات. |
| databaseName | اسم قاعدة بيانات Azure Cosmos DB مع المجموعة التي يتم مراقبتها. |
| collectionName | اسم المجموعة التي يتم مراقبتها. |
| createIfNotExists | قيمة منطقية للإشارة إلى ما إذا كانت المجموعة قد تم إنشاؤها عند عدم وجودها أم لا. القيمة الافتراضية هي false لأنه يتم إنشاء مجموعات جديدة باستخدام معدل النقل المحجوز، والذي له آثار تكلفة. لمزيد من المعلومات، يُرجى الرجوع إلى صفحة التسعير. |
| partitionKey | عندما تكون createIfNotExists صحيحة، يحدد مسار مفتاح القسم للمجموعة التي تم إنشاؤها. قد تتضمن معلمات الربط. |
| *المجموعةالإنتاجية | عندما تكون createIfNotExists صحيحة، فهي تحدد معدل نقل المجموعة التي تم إنشاؤها. |
| preferredLocations | (اختياري) يعرف المواقع المفضلة (المناطق) لحسابات قاعدة البيانات المنسوخة جغرافيا في خدمة Azure Cosmos DB. يجب فصل القيم بفواصل. على سبيل المثال، East US,South Central US,North Europe. |
| useMultipleWriteLocations | (اختياري) عند التعيين إلى جنبا إلى true جنب مع preferredLocations، يدعم عمليات الكتابة متعددة المناطق في خدمة Azure Cosmos DB. |
راجع قسم المثال للحصول على أمثلة كاملة.
الاستخدام
بشكل افتراضي، عند الكتابة إلى معلمة الإخراج في الدالة الخاصة بك، يتم إنشاء مستند في قاعدة البيانات الخاصة بك. يحتوي هذا المستند على GUID تم إنشاؤه تلقائيًا كمعرف للمستند. يمكنك تحديد معرف الوثيقة لوثيقة الإخراج عن طريق تحديد خاصية المعرف في كائن JSON الذي تم تمريره إلى معلمة الإخراج.
ملاحظة
عند تحديد معرف مستند موجود، فإنه يُحذف بواسطة مستند الإخراج الجديد.
الاتصالات
تعد connectionStringSetting/connection الخصائص والخصائص leaseConnectionStringSetting/leaseConnection مراجع لتكوين البيئة الذي يحدد كيفية اتصال التطبيق بقاعدة بيانات Azure Cosmos. وقد تحدد:
- اسم إعداد تطبيق يحتوي على سلسلة اتصال
- اسم بادئة مشتركة لإعدادات تطبيق متعددة، تحدد معا اتصالا يستند إلى الهوية. يتوفر هذا الخيار فقط للإصدارات
connectionوالإصداراتleaseConnectionمن الإصدار 4.x أو أعلى من الإضافة.
إذا كانت القيمة التي تم تكوينها مطابقة تامة لإعداد واحد ومطابقة بادئة لإعدادات أخرى، استخدام التطابق التام.
سلسلة الاتصال
يجب تخزين سلسلة الاتصال لحساب قاعدة البيانات الخاص بك في إعداد تطبيق باسم يطابق القيمة المحددة بواسطة خاصية الاتصال الخاصة بتكوين الربط.
الاتصالات القائمة على الهوية
إذا كنت تستخدم الإصدار 4.x أو أعلى من الملحق، فبدلا من استخدام سلسلة اتصال مع سر، يمكنك جعل التطبيق يستخدم هوية Azure Active Directory. للقيام بذلك ، يمكنك تحديد الإعدادات ضمن بادئة شائعة يتم تعيينها إلى خاصية الاتصال في تكوين المشغل والربط.
في هذا الوضع، يتطلب الملحق الخصائص التالية:
| الخاصية | قالب متغير البيئة | الوصف | قيمة المثال |
|---|---|---|---|
| نقطة نهاية الحساب | <CONNECTION_NAME_PREFIX>__accountEndpoint |
نقطة نهاية حساب Azure Cosmos DB URI. | https://< database_account_name.documents.azure.com:443/> |
قد يتم تعيين خصائص إضافية لتخصيص الاتصال. راجع الخصائص الشائعة للاتصالات المستندة إلى الهوية.
عند استضافتها في خدمة Azure Functions، تستخدم الاتصالات المستندة إلى الهوية هوية مدارة. تستخدم الهوية المعينة من قبل النظام بشكل افتراضي على الرغم من إمكانية تحديد هوية معينة من قبل المستخدم مع خصائص credential و clientID. عند التشغيل في سياقات أخرى، مثل التطوير المحلي، يتم استخدام هوية المطور بدلا من ذلك، على الرغم من أنه يمكن تخصيصها. راجع التنمية المحلية مع الاتصالات القائمة على الهوية.
منح الإذن للهوية
مهما كانت الهوية المستخدمة يجب أن يكون لديك أذونات لتنفيذ الإجراءات المقصودة. ستحتاج إلى تعيين دور في Azure RBAC، باستخدام أدوار مضمنة أو مخصصة توفر هذه الأذونات.
هام
قد تعرض بعض الأذونات بواسطة الخدمة الهدف غير الضرورية لكافة السياقات. حيثما أمكن، الالتزام بمبدأ أقل امتيازومنح الهوية الامتيازات المطلوبة فقط. على سبيل المثال، إذا كان التطبيق يحتاج فقط إلى أن يكون قادرا على القراءة من مصدر بيانات، فاستخدم دورا لديه إذن للقراءة فقط. سيكون من غير المناسب تعيين دور يسمح أيضا بالكتابة إلى تلك الخدمة ، لأن هذا سيكون إذنا مفرطا لعملية قراءة. وبالمثل ، قد ترغب في التأكد من أن تعيين الدور يتم تحديده فقط على الموارد التي تحتاج إلى قراءة.
ستحتاج إلى إنشاء تعيين دور يوفر الوصول إلى حساب قاعدة البيانات الخاص بك في وقت التشغيل. إن أدوار الإدارة، مثل Owner، غير كافية. يوضح الجدول التالي الأدوار المضمنة الموصى بها عند استخدام ملحق قاعدة بيانات Cosmos في التشغيل العادي. قد يتطلب التطبيق الخاص بك أذونات إضافية استنادا إلى التعليمة البرمجية التي تكتبها.
| نوع الربط | مثال على الأدوار المضمنة |
|---|---|
| مشغّل | مساهم بيانات Cosmos DB المدمج |
| ربط بيانات الإدخال | قارئ بيانات Cosmos DB المدمج |
| ربط بيانات الإخراج | مساهم بيانات Cosmos DB المدمج |
الاستثناءات والتعليمات البرمجية للإرجاع
| Binding | المرجع |
|---|---|
| CosmosDB | تعليمات الخطأ البرمجية لـCosmosDB |