Aracılığıyla paylaş


Azure İşlevleri 2.x ve üzeri için Azure Cosmos DB giriş bağlaması

Azure Cosmos DB giriş bağlaması SQL API'sini kullanarak bir veya daha fazla Azure Cosmos DB belgesini getirir ve işlevin giriş parametresine iletir. Belge kimliği veya sorgu parametreleri, işlevi çağıran tetikleyiciye göre belirlenebilir.

Kurulum ve yapılandırma ayrıntıları hakkında bilgi için genel bakışa bakın.

Not

Koleksiyon bölümlendiğinde, arama işlemleri bölüm anahtarı değerini de belirtmelidir.

Önemli

Bu makalede, Node.js programlama modelinin birden çok sürümünü desteklemek için sekmeler kullanılır. Genel kullanıma sunulan v4 modeli, JavaScript ve TypeScript geliştiricileri için daha esnek ve sezgisel bir deneyime sahip olacak şekilde tasarlanmıştır. v4 modelinin nasıl çalıştığı hakkında daha fazla bilgi için Azure İşlevleri Node.js geliştirici kılavuzuna bakın. v3 ile v4 arasındaki farklar hakkında daha fazla bilgi edinmek için geçiş kılavuzuna bakın.

Azure İşlevleri, Python için iki programlama modelini destekler. Bağlamalarınızı tanımlama şekliniz seçtiğiniz programlama modeline bağlıdır.

Python v2 programlama modeli, doğrudan Python işlev kodunuzda dekoratörleri kullanarak bağlamaları tanımlamanıza olanak tanır. Daha fazla bilgi için bkz . Python geliştirici kılavuzu.

Bu makale her iki programlama modelini de destekler.

Örnek

Aksi belirtilmediği sürece, bu makaledeki örnekler Azure Cosmos DB uzantısının 3.x sürümünü hedeflemektedir. 4.x uzantı sürümüyle kullanmak için özellik ve öznitelik adlarındaki dizeyi collection ile containerdeğiştirmeniz gerekir.

C# işlevi aşağıdaki C# modlarından biri kullanılarak oluşturulabilir:

  • Yalıtılmış çalışan modeli: Çalışma zamanından yalıtılmış bir çalışan işleminde çalışan derlenmiş C# işlevi. LTS ve .NET ve .NET Framework dışındaki sürümlerde çalışan C# işlevlerini desteklemek için yalıtılmış çalışan işlemi gereklidir. Yalıtılmış çalışan işlemi işlevleri için uzantılar ad alanlarını kullanır Microsoft.Azure.Functions.Worker.Extensions.* .
  • İşlem içi model: İşlevler çalışma zamanıyla aynı işlemde çalışan derlenmiş C# işlevi. Bu modelin bir varyasyonunda, İşlevler öncelikle C# portalı düzenleme için desteklenen C# betiği kullanılarak çalıştırılabilir. İşlem içi işlevlerin uzantıları ad alanlarını kullanır Microsoft.Azure.WebJobs.Extensions.* .

Önemli

İşlem içi model desteği 10 Kasım 2026'da sona erecektir. Tam destek için uygulamalarınızı yalıtılmış çalışan modeline geçirmenizi kesinlikle öneririz.

Bu bölüm, Azure Cosmos DB uzantısının 3.x sürümünü ve Azure Depolama uzantısının 5.x sürümünü gerektiren örnekler içerir. İşlev uygulamanızda henüz yoksa aşağıdaki NuGet paketlerine başvuru ekleyin:

Örnekler basit ToDoItem bir türe başvurur:

[Function(nameof(DocByIdFromJSON))]
public void DocByIdFromJSON(
    [QueueTrigger("todoqueueforlookup")] ToDoItemLookup toDoItemLookup,
    [CosmosDBInput(
        databaseName: "ToDoItems",
        containerName: "Items",
        Connection  = "CosmosDBConnection",
        Id = "{ToDoItemId}",
        PartitionKey = "{ToDoItemPartitionKeyValue}")] ToDoItem toDoItem)
{
    _logger.LogInformation($"C# Queue trigger function processed Id={toDoItemLookup?.ToDoItemId} Key={toDoItemLookup?.ToDoItemPartitionKeyValue}");

    if (toDoItem == null)
    {
        _logger.LogInformation($"ToDo item not found");
    }
    else
    {
        _logger.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
}

Kuyruk tetikleyicisi, JSON'dan kimlik arama

Aşağıdaki örnekte tek bir belgeyi alan bir işlev gösterilmektedir. İşlev, depolama kuyruğundaki bir JSON iletisi tarafından tetikleniyor. Kuyruk tetikleyicisi, JSON'ı alınacak kimlik ve bölüm anahtarı değerini içeren türünde ToDoItemLookupbir nesneye ayrıştırıyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem döndürmek için kullanılır.

[Function(nameof(DocByIdFromJSON))]
public void DocByIdFromJSON(
    [QueueTrigger("todoqueueforlookup")] ToDoItemLookup toDoItemLookup,
    [CosmosDBInput(
        databaseName: "ToDoItems",
        containerName: "Items",
        Connection  = "CosmosDBConnection",
        Id = "{ToDoItemId}",
        PartitionKey = "{ToDoItemPartitionKeyValue}")] ToDoItem toDoItem)
{
    _logger.LogInformation($"C# Queue trigger function processed Id={toDoItemLookup?.ToDoItemId} Key={toDoItemLookup?.ToDoItemPartitionKeyValue}");

    if (toDoItem == null)
    {
        _logger.LogInformation($"ToDo item not found");
    }
    else
    {
        _logger.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
    }
}

Bu bölüm aşağıdaki örnekleri içerir:

Örnekler basit ToDoItem bir türe başvurur:

public class ToDoItem {

  private String id;
  private String description;

  public String getId() {
    return id;
  }

  public String getDescription() {
    return description;
  }

  @Override
  public String toString() {
    return "ToDoItem={id=" + id + ",description=" + description + "}";
  }
}

HTTP tetikleyicisi, sorgu dizesinden kimlik arama - Dize parametresi

Aşağıdaki örnekte, tek bir belgeyi alan bir Java işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan Dize biçiminde bir belge almak için kullanılır.

public class DocByIdFromQueryString {

    @FunctionName("DocByIdFromQueryString")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBInput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              id = "{Query.id}",
              partitionKey = "{Query.partitionKeyValue}",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            Optional<String> item,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());
        context.getLogger().info("String from the database is " + (item.isPresent() ? item.get() : null));

        // Convert and display
        if (!item.isPresent()) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                          .body("Document not found.")
                          .build();
        }
        else {
            // return JSON from Cosmos. Alternatively, we can parse the JSON string
            // and return an enriched JSON object.
            return request.createResponseBuilder(HttpStatus.OK)
                          .header("Content-Type", "application/json")
                          .body(item.get())
                          .build();
        }
    }
}

Java işlevleri çalışma zamanı kitaplığında, değeri Azure Cosmos DB'den gelen işlev parametrelerinde ek açıklamayı kullanın@CosmosDBInput. Bu ek açıklama kullanılarak yerel Java türleri, POJO'lar veya null atanabilir değerlerle Optional<T>kullanılabilir.

HTTP tetikleyicisi, sorgu dizesinden kimlik arama - POJO parametresi

Aşağıdaki örnekte, tek bir belgeyi alan bir Java işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetikleniyor. Belirtilen veritabanından ve koleksiyondan belge almak için kullanılan kimlik ve bölüm anahtarı değeri. Belge daha sonra daha önce oluşturulan POJO örneğine ToDoItem dönüştürülür ve işleve bağımsız değişken olarak geçirilir.

public class DocByIdFromQueryStringPojo {

    @FunctionName("DocByIdFromQueryStringPojo")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBInput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              id = "{Query.id}",
              partitionKey = "{Query.partitionKeyValue}",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            ToDoItem item,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());
        context.getLogger().info("Item from the database is " + item);

        // Convert and display
        if (item == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                          .body("Document not found.")
                          .build();
        }
        else {
            return request.createResponseBuilder(HttpStatus.OK)
                          .header("Content-Type", "application/json")
                          .body(item)
                          .build();
        }
    }
}

HTTP tetikleyicisi, rota verilerinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir Java işlevi gösterilmektedir. İşlev, aramak için kimlik ve bölüm anahtarı değerini belirtmek için bir yol parametresi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belgeyi almak için kullanılır ve bunu olarak Optional<String>döndürür.

public class DocByIdFromRoute {

    @FunctionName("DocByIdFromRoute")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS,
              route = "todoitems/{partitionKeyValue}/{id}")
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBInput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              id = "{id}",
              partitionKey = "{partitionKeyValue}",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            Optional<String> item,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());
        context.getLogger().info("String from the database is " + (item.isPresent() ? item.get() : null));

        // Convert and display
        if (!item.isPresent()) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                          .body("Document not found.")
                          .build();
        }
        else {
            // return JSON from Cosmos. Alternatively, we can parse the JSON string
            // and return an enriched JSON object.
            return request.createResponseBuilder(HttpStatus.OK)
                          .header("Content-Type", "application/json")
                          .body(item.get())
                          .build();
        }
    }
}

HTTP tetikleyicisi, SqlQuery kullanarak yol verilerinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir Java işlevi gösterilmektedir. İşlev, arama kimliğini belirtmek için bir yol parametresi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik, sorgu ölçütlerine bağlı olarak birçok belge döndürülebileceğinden, belirtilen veritabanından ve koleksiyondan belgeyi almak için kullanılır ve sonuç kümesi olarak ToDoItem[]dönüştürülür.

Not

Yalnızca kimlikle sorgulamanız gerekiyorsa, daha az istek birimi kullanacağı için önceki örnekler gibi bir arama kullanmanız önerilir. Nokta okuma işlemleri (GET), kimliğe göre sorgulardan daha verimlidir.

public class DocByIdFromRouteSqlQuery {

    @FunctionName("DocByIdFromRouteSqlQuery")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS,
              route = "todoitems2/{id}")
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBInput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              sqlQuery = "select * from Items r where r.id = {id}",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            ToDoItem[] item,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());
        context.getLogger().info("Items from the database are " + item);

        // Convert and display
        if (item == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                          .body("Document not found.")
                          .build();
        }
        else {
            return request.createResponseBuilder(HttpStatus.OK)
                          .header("Content-Type", "application/json")
                          .body(item)
                          .build();
        }
    }
}

HTTP tetikleyicisi, SqlQuery kullanarak yol verilerinden birden çok belge alın

Aşağıdaki örnekte birden çok belge alan bir Java işlevi gösterilmektedir. İşlev, alanda aranacak dizeyi belirtmek için description yol parametresi desc kullanan bir HTTP isteği tarafından tetikleniyor. Arama terimi, belirtilen veritabanından ve koleksiyondan bir belge koleksiyonu almak için kullanılır, sonuç kümesi öğesine ToDoItem[] dönüştürülür ve işleve bağımsız değişken olarak geçirilir.

public class DocsFromRouteSqlQuery {

    @FunctionName("DocsFromRouteSqlQuery")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET},
              authLevel = AuthorizationLevel.ANONYMOUS,
              route = "todoitems3/{desc}")
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBInput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              sqlQuery = "select * from Items r where contains(r.description, {desc})",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            ToDoItem[] items,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());
        context.getLogger().info("Number of items from the database is " + (items == null ? 0 : items.length));

        // Convert and display
        if (items == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                          .body("No documents found.")
                          .build();
        }
        else {
            return request.createResponseBuilder(HttpStatus.OK)
                          .header("Content-Type", "application/json")
                          .body(items)
                          .build();
        }
    }
}

Bu bölüm, çeşitli kaynaklardan bir kimlik değeri belirterek tek bir belgeyi okuyan aşağıdaki örnekleri içerir:

Kuyruk tetikleyicisi, JSON'dan kimlik arama

Aşağıdaki örnekte, tek bir belgeyi okuyan ve belgenin metin değerini güncelleştiren bir TypeScript işlevi gösterilmektedir.

import { app, input, InvocationContext, output } from '@azure/functions';

const cosmosInput = input.cosmosDB({
    databaseName: 'MyDatabase',
    collectionName: 'MyCollection',
    id: '{queueTrigger}',
    partitionKey: '{queueTrigger}',
    connectionStringSetting: 'MyAccount_COSMOSDB',
});

const cosmosOutput = output.cosmosDB({
    databaseName: 'MyDatabase',
    collectionName: 'MyCollection',
    createIfNotExists: false,
    partitionKey: '{queueTrigger}',
    connectionStringSetting: 'MyAccount_COSMOSDB',
});

interface MyDocument {
    text: string;
}

export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<void> {
    const doc = <MyDocument>context.extraInputs.get(cosmosInput);
    doc.text = 'This was updated!';
    context.extraOutputs.set(cosmosOutput, doc);
}

app.storageQueue('storageQueueTrigger1', {
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [cosmosInput],
    extraOutputs: [cosmosOutput],
    handler: storageQueueTrigger1,
});

HTTP tetikleyicisi, sorgu dizesinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir TypeScript işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

import { app, HttpRequest, HttpResponseInit, input, InvocationContext } from '@azure/functions';

const cosmosInput = input.cosmosDB({
    databaseName: 'ToDoItems',
    collectionName: 'Items',
    id: '{Query.id}',
    partitionKey: '{Query.partitionKeyValue}',
    connectionStringSetting: 'CosmosDBConnection',
});

interface ToDoDocument {
    description: string;
}

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    const toDoItem = <ToDoDocument>context.extraInputs.get(cosmosInput);
    if (!toDoItem) {
        return {
            status: 404,
            body: 'ToDo item not found',
        };
    } else {
        return {
            body: `Found ToDo item, Description=${toDoItem.description}`,
        };
    }
}

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    extraInputs: [cosmosInput],
    handler: httpTrigger1,
});

HTTP tetikleyicisi, rota verilerinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir TypeScript işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için yol verilerini kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

import { app, HttpRequest, HttpResponseInit, input, InvocationContext } from '@azure/functions';

const cosmosInput = input.cosmosDB({
    databaseName: 'ToDoItems',
    collectionName: 'Items',
    id: '{id}',
    partitionKey: '{partitionKeyValue}',
    connectionStringSetting: 'CosmosDBConnection',
});

interface ToDoDocument {
    description: string;
}

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    const toDoItem = <ToDoDocument>context.extraInputs.get(cosmosInput);
    if (!toDoItem) {
        return {
            status: 404,
            body: 'ToDo item not found',
        };
    } else {
        return {
            body: `Found ToDo item, Description=${toDoItem.description}`,
        };
    }
}

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    route: 'todoitems/{partitionKeyValue}/{id}',
    extraInputs: [cosmosInput],
    handler: httpTrigger1,
});

SqlQuery kullanarak kuyruk tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte, sorgu parametrelerini özelleştirmek için kuyruk tetikleyicisi kullanarak SQL sorgusu tarafından belirtilen birden çok belgeyi alan bir TypeScript işlevi gösterilmektedir.

Kuyruk tetikleyicisi bir parametresi departmentIdsağlar. kuyruk iletisi { "departmentId" : "Finance" } , finans departmanı için tüm kayıtları döndürür.

import { app, input, InvocationContext } from '@azure/functions';

const cosmosInput = input.cosmosDB({
    databaseName: 'MyDb',
    collectionName: 'MyCollection',
    sqlQuery: 'SELECT * from c where c.departmentId = {departmentId}',
    connectionStringSetting: 'CosmosDBConnection',
});

interface MyDocument {}

export async function storageQueueTrigger1(queueItem: unknown, context: InvocationContext): Promise<void> {
    const documents = <MyDocument[]>context.extraInputs.get(cosmosInput);
    for (const document of documents) {
        // operate on each document
    }
}

app.storageQueue('storageQueueTrigger1', {
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [cosmosInput],
    handler: storageQueueTrigger1,
});

Bu bölüm, çeşitli kaynaklardan bir kimlik değeri belirterek tek bir belgeyi okuyan aşağıdaki örnekleri içerir:

Kuyruk tetikleyicisi, JSON'dan kimlik arama

Aşağıdaki örnekte, tek bir belgeyi okuyan ve belgenin metin değerini güncelleştiren bir JavaScript işlevi gösterilmektedir.

const { app, input, output } = require('@azure/functions');

const cosmosInput = input.cosmosDB({
    databaseName: 'MyDatabase',
    collectionName: 'MyCollection',
    id: '{queueTrigger}',
    partitionKey: '{queueTrigger}',
    connectionStringSetting: 'MyAccount_COSMOSDB',
});

const cosmosOutput = output.cosmosDB({
    databaseName: 'MyDatabase',
    collectionName: 'MyCollection',
    createIfNotExists: false,
    partitionKey: '{queueTrigger}',
    connectionStringSetting: 'MyAccount_COSMOSDB',
});

app.storageQueue('storageQueueTrigger1', {
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [cosmosInput],
    extraOutputs: [cosmosOutput],
    handler: (queueItem, context) => {
        const doc = context.extraInputs.get(cosmosInput);
        doc.text = 'This was updated!';
        context.extraOutputs.set(cosmosOutput, doc);
    },
});

HTTP tetikleyicisi, sorgu dizesinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir JavaScript işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

const { app, input } = require('@azure/functions');

const cosmosInput = input.cosmosDB({
    databaseName: 'ToDoItems',
    collectionName: 'Items',
    id: '{Query.id}',
    partitionKey: '{Query.partitionKeyValue}',
    connectionStringSetting: 'CosmosDBConnection',
});

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    extraInputs: [cosmosInput],
    handler: (request, context) => {
        const toDoItem = context.extraInputs.get(cosmosInput);
        if (!toDoItem) {
            return {
                status: 404,
                body: 'ToDo item not found',
            };
        } else {
            return {
                body: `Found ToDo item, Description=${toDoItem.Description}`,
            };
        }
    },
});

HTTP tetikleyicisi, rota verilerinden kimlik arama

Aşağıdaki örnekte, tek bir belgeyi alan bir JavaScript işlevi gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için yol verilerini kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

const { app, input } = require('@azure/functions');

const cosmosInput = input.cosmosDB({
    databaseName: 'ToDoItems',
    collectionName: 'Items',
    id: '{id}',
    partitionKey: '{partitionKeyValue}',
    connectionStringSetting: 'CosmosDBConnection',
});

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    route: 'todoitems/{partitionKeyValue}/{id}',
    extraInputs: [cosmosInput],
    handler: (request, context) => {
        const toDoItem = context.extraInputs.get(cosmosInput);
        if (!toDoItem) {
            return {
                status: 404,
                body: 'ToDo item not found',
            };
        } else {
            return {
                body: `Found ToDo item, Description=${toDoItem.Description}`,
            };
        }
    },
});

SqlQuery kullanarak kuyruk tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte, sorgu parametrelerini özelleştirmek için kuyruk tetikleyicisi kullanarak SQL sorgusu tarafından belirtilen birden çok belgeyi alan bir JavaScript işlevi gösterilmektedir.

Kuyruk tetikleyicisi bir parametresi departmentIdsağlar. kuyruk iletisi { "departmentId" : "Finance" } , finans departmanı için tüm kayıtları döndürür.

const { app, input } = require('@azure/functions');

const cosmosInput = input.cosmosDB({
    databaseName: 'MyDb',
    collectionName: 'MyCollection',
    sqlQuery: 'SELECT * from c where c.departmentId = {departmentId}',
    connectionStringSetting: 'CosmosDBConnection',
});

app.storageQueue('storageQueueTrigger1', {
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
    extraInputs: [cosmosInput],
    handler: (queueItem, context) => {
        const documents = context.extraInputs.get(cosmosInput);
        for (const document of documents) {
            // operate on each document
        }
    },
});

Kuyruk tetikleyicisi, JSON'dan kimlik arama

Aşağıdaki örnekte, tek bir Azure Cosmos DB belgesinin nasıl okunduğu ve güncelleştirilecek olduğu gösterilmektedir. Belgenin benzersiz tanımlayıcısı, kuyruk iletisindeki JSON değeri aracılığıyla sağlanır.

Azure Cosmos DB giriş bağlaması, işlevin yapılandırma dosyasında (function.json) bulunan bağlamalar listesinde ilk sırada listelenir.

{
  "name": "InputDocumentIn",
  "type": "cosmosDB",
  "databaseName": "MyDatabase",
  "collectionName": "MyCollection",
  "id": "{queueTrigger_payload_property}",
  "partitionKey": "{queueTrigger_payload_property}",
  "connectionStringSetting": "CosmosDBConnection",
  "direction": "in"
},
{
  "name": "InputDocumentOut",
  "type": "cosmosDB",
  "databaseName": "MyDatabase",
  "collectionName": "MyCollection",
  "createIfNotExists": false,
  "partitionKey": "{queueTrigger_payload_property}",
  "connectionStringSetting": "CosmosDBConnection",
  "direction": "out"
}

run.ps1 dosyasında, gelen belgeyi okuyan ve değişiklikleri çıkaran PowerShell kodu bulunur.

param($QueueItem, $InputDocumentIn, $TriggerMetadata)

$Document = $InputDocumentIn 
$Document.text = 'This was updated!'

Push-OutputBinding -Name InputDocumentOut -Value $Document  

HTTP tetikleyicisi, sorgu dizesinden kimlik arama

Aşağıdaki örnekte, bir web API'sinden tek bir Azure Cosmos DB belgesinin nasıl okunduğu ve güncelleştirilduğu gösterilmektedir. Belgenin benzersiz tanımlayıcısı, bağlamanın "Id": "{Query.Id}" özelliğinde tanımlandığı gibi HTTP isteğinden bir querystring parametresi aracılığıyla sağlanır.

Azure Cosmos DB giriş bağlaması, işlevin yapılandırma dosyasında (function.json) bulunan bağlamalar listesinde ilk sırada listelenir.

{ 
  "bindings": [ 
    { 
      "type": "cosmosDB", 
      "name": "ToDoItem", 
      "databaseName": "ToDoItems", 
      "collectionName": "Items", 
      "connectionStringSetting": "CosmosDBConnection", 
      "direction": "in", 
      "Id": "{Query.id}", 
      "PartitionKey": "{Query.partitionKeyValue}" 
    },
    { 
      "authLevel": "anonymous", 
      "name": "Request", 
      "type": "httpTrigger", 
      "direction": "in", 
      "methods": [ 
        "get", 
        "post" 
      ] 
    }, 
    { 
      "name": "Response", 
      "type": "http", 
      "direction": "out" 
    },
  ], 
  "disabled": false 
} 

run.ps1 dosyasında, gelen belgeyi okuyan ve değişiklikleri çıkaran PowerShell kodu bulunur.

using namespace System.Net

param($Request, $ToDoItem, $TriggerMetadata)

Write-Host 'PowerShell HTTP trigger function processed a request'

if (-not $ToDoItem) { 
    Write-Host 'ToDo item not found'

    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ 
        StatusCode = [HttpStatusCode]::NotFound 
        Body = $ToDoItem.Description 
    })

} else {

    Write-Host "Found ToDo item, Description=$($ToDoItem.Description)"

    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ 
        StatusCode = [HttpStatusCode]::OK 
        Body = $ToDoItem.Description 
    }) 
}

HTTP tetikleyicisi, rota verilerinden kimlik arama

Aşağıdaki örnekte, bir web API'sinden tek bir Azure Cosmos DB belgesinin nasıl okunduğu ve güncelleştirilduğu gösterilmektedir. Belgenin benzersiz tanımlayıcısı bir yol parametresi aracılığıyla sağlanır. Yol parametresi HTTP isteği bağlamasının route özelliğinde tanımlanır ve Azure Cosmos DB "Id": "{Id}" bağlama özelliğinde başvurulur.

Azure Cosmos DB giriş bağlaması, işlevin yapılandırma dosyasında (function.json) bulunan bağlamalar listesinde ilk sırada listelenir.

{ 
  "bindings": [ 
    { 
      "type": "cosmosDB", 
      "name": "ToDoItem", 
      "databaseName": "ToDoItems", 
      "collectionName": "Items", 
      "connectionStringSetting": "CosmosDBConnection", 
      "direction": "in", 
      "Id": "{id}", 
      "PartitionKey": "{partitionKeyValue}" 
    },
    { 
      "authLevel": "anonymous", 
      "name": "Request", 
      "type": "httpTrigger", 
      "direction": "in", 
      "methods": [ 
        "get", 
        "post" 
      ], 
      "route": "todoitems/{partitionKeyValue}/{id}" 
    }, 
    { 
      "name": "Response", 
      "type": "http", 
      "direction": "out" 
    }
  ], 
  "disabled": false 
} 

run.ps1 dosyasında, gelen belgeyi okuyan ve değişiklikleri çıkaran PowerShell kodu bulunur.

using namespace System.Net

param($Request, $ToDoItem, $TriggerMetadata)

Write-Host 'PowerShell HTTP trigger function processed a request'

if (-not $ToDoItem) { 
    Write-Host 'ToDo item not found'

    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ 
        StatusCode = [HttpStatusCode]::NotFound 
        Body = $ToDoItem.Description 
    })

} else { 
    Write-Host "Found ToDo item, Description=$($ToDoItem.Description)"

    Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ 
        StatusCode = [HttpStatusCode]::OK 
        Body = $ToDoItem.Description 
    }) 
} 

SqlQuery kullanarak kuyruk tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte birden çok Azure Cosmos DB belgesinin nasıl okunduğu gösterilmektedir. İşlevin yapılandırma dosyası (function.json) bağlama özelliklerini tanımlar ve bu da öğesini sqlQueryiçerir. özelliğine sqlQuery sağlanan SQL deyimi, işleve sağlanan belge kümesini seçer.

{ 
  "name": "Documents", 
  "type": "cosmosDB", 
  "direction": "in", 
  "databaseName": "MyDb", 
  "collectionName": "MyCollection", 
  "sqlQuery": "SELECT * from c where c.departmentId = {departmentId}", 
  "connectionStringSetting": "CosmosDBConnection" 
} 

run1.ps1 dosyasında, gelen belgeleri okuyan PowerShell kodu bulunur.

param($QueueItem, $Documents, $TriggerMetadata)

foreach ($Document in $Documents) { 
    # operate on each document 
} 

Bu bölüm, çeşitli kaynaklardan bir kimlik değeri belirterek tek bir belgeyi okuyan aşağıdaki örnekleri içerir:

Örnekler, v1 veya v2 Python programlama modelini kullanıp kullanmadığınıza bağlıdır.

Kuyruk tetikleyicisi, JSON'dan kimlik arama

Aşağıdaki örnekte bir Azure Cosmos DB giriş bağlaması gösterilmektedir. işlevi tek bir belgeyi okur ve belgenin metin değerini güncelleştirir.

import logging
import azure.functions as func

app = func.FunctionApp()

@app.queue_trigger(arg_name="msg", 
                   queue_name="outqueue", 
                   connection="AzureWebJobsStorage")
@app.cosmos_db_input(arg_name="documents", 
                     database_name="MyDatabase",
                     collection_name="MyCollection",
                     id="{msg.payload_property}",
                     partition_key="{msg.payload_property}",
                     connection_string_setting="MyAccount_COSMOSDB")
@app.cosmos_db_output(arg_name="outputDocument", 
                      database_name="MyDatabase",
                      collection_name="MyCollection",
                      connection_string_setting="MyAccount_COSMOSDB")
def test_function(msg: func.QueueMessage,
                  inputDocument: func.DocumentList, 
                  outputDocument: func.Out[func.Document]):
     document = documents[id]
     document["text"] = "This was updated!"
     doc = inputDocument[0]
     doc["text"] = "This was updated!"
     outputDocument.set(doc)
     print(f"Updated document.")

HTTP tetikleyicisi, sorgu dizesinden kimlik arama

Aşağıdaki örnekte tek bir belgeyi alan bir işlev gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

Şu anda v2 için eşdeğer örnek yok.

HTTP tetikleyicisi, rota verilerinden kimlik arama

Aşağıdaki örnekte tek bir belgeyi alan bir işlev gösterilmektedir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için yol verilerini kullanan bir HTTP isteği tarafından tetikleniyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanından ve koleksiyondan belge ToDoItem almak için kullanılır.

Şu anda v2 için eşdeğer örnek yok.

SqlQuery kullanarak kuyruk tetikleyicisi, birden çok belge alma

Aşağıdaki örnekte bağlamayı kullanan bir Azure Cosmos DB giriş bağlama Python işlevi gösterilmektedir. İşlev, sorgu parametrelerini özelleştirmek için bir kuyruk tetikleyicisi kullanarak SQL sorgusu tarafından belirtilen birden çok belgeyi alır.

Kuyruk tetikleyicisi bir parametresi departmentIdsağlar. kuyruk iletisi { "departmentId" : "Finance" } , finans departmanı için tüm kayıtları döndürür.

Şu anda v2 için eşdeğer örnek yok.

Özellikler

hem işlem içi hem de yalıtılmış çalışan işlemi C# kitaplıkları işlevi tanımlamak için öznitelikleri kullanır. Bunun yerine C# betiği, C# betik kılavuzunda açıklandığı gibi bir function.json yapılandırma dosyası kullanır.

Öznitelik özelliği Açıklama
Bağlantı Sorgulanan Azure Cosmos DB hesabına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Daha fazla bilgi için bkz . Bağlantılar.
DatabaseName Kapsayıcının izlendiği Azure Cosmos DB veritabanının adı.
ContainerName İzlenen kapsayıcının adı.
PartitionKey Arama için bölüm anahtarı değerini belirtir. Bağlama parametreleri içerebilir. Bölümlenmiş kapsayıcılardaki aramalar için gereklidir.
Kimlik Alınacak belgenin kimliği. Bu özellik bağlama ifadelerini destekler. hem hem SqlQuery de Id özelliklerini ayarlamayın. Herhangi birini ayarlamazsanız kapsayıcının tamamı alınır.
SqlQuery Birden çok belgeyi almak için kullanılan bir Azure Cosmos DB SQL sorgusu. özelliği, şu örnekte olduğu gibi çalışma zamanı bağlamalarını destekler: SELECT * FROM c where c.departmentId = {departmentId}. hem hem SqlQuery de Id özelliklerini ayarlamayın. Herhangi birini ayarlamazsanız kapsayıcının tamamı alınır.
PreferredLocations (İsteğe bağlı) Azure Cosmos DB hizmetinde coğrafi olarak çoğaltılan veritabanı hesapları için tercih edilen konumları (bölgeleri) tanımlar. Değerler virgülle ayrılmış olmalıdır. Örneğin, East US,South Central US,North Europe.

Dekoratörler

Yalnızca Python v2 programlama modeli için geçerlidir.

Python v2 işlevleri, uzantı sürümüne cosmos_db_input bağlı olarak bu özellikleri destekleyen dekoratör kullanılarak tanımlanır:

Özellik Açıklama
arg_name Değişiklikleri olan belgelerin listesini temsil eden işlev kodunda kullanılan değişken adı.
database_name Koleksiyonun izlendiği Azure Cosmos DB veritabanının adı.
container_name İzlenen Azure Cosmos DB koleksiyonunun adı.
connection İzlenen Azure Cosmos DB'nin bağlantı dizesi.
partition_key İzlenen Azure Cosmos DB'nin bölüm anahtarı.
id Alınacak belgenin kimliği.

function.json kullanılarak tanımlanan Python işlevleri için Yapılandırma bölümüne bakın.

Ek Açıklamalar

Java işlevleri çalışma zamanı kitaplığından @CosmosDBInput Azure Cosmos DB'den okunan parametrelerde ek açıklamayı kullanın. Ek açıklama aşağıdaki özellikleri destekler:

Yapılandırma

Yalnızca Python v1 programlama modeli için geçerlidir.

Aşağıdaki tabloda, yöntemine geçirilen input.cosmosDB() nesnede options ayarlayabileceğiniz özellikler açıklanmaktadır. type, directionve name özellikleri v4 modeline uygulanmaz.

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanır ve burada özellikler uzantı sürümüne göre farklılık gösterir:

function.json özelliği Açıklama
type olarak ayarlanmalıdır cosmosDB.
direction olarak ayarlanmalıdır in.
ad Değişiklikleri olan belgelerin listesini temsil eden işlev kodunda kullanılan değişken adı.
bağlantı İzlenen Azure Cosmos DB hesabına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar kapsayıcısının adı. Daha fazla bilgi için bkz . Bağlantılar.
databaseName Kapsayıcının izlendiği Azure Cosmos DB veritabanının adı.
containerName İzlenen kapsayıcının adı.
partitionKey Arama için bölüm anahtarı değerini belirtir. Bağlama parametreleri içerebilir. Bölümlenmiş kapsayıcılardaki aramalar için gereklidir.
id Alınacak belgenin kimliği. Bu özellik bağlama ifadelerini destekler. hem hem sqlQuery de id özelliklerini ayarlamayın. Herhangi birini ayarlamazsanız kapsayıcının tamamı alınır.
sqlQuery Birden çok belgeyi almak için kullanılan bir Azure Cosmos DB SQL sorgusu. özelliği, şu örnekte olduğu gibi çalışma zamanı bağlamalarını destekler: SELECT * FROM c where c.departmentId = {departmentId}. hem hem sqlQuery de id özelliklerini ayarlamayın. Herhangi birini ayarlamazsanız kapsayıcının tamamı alınır.
preferredLocations (İsteğe bağlı) Azure Cosmos DB hizmetinde coğrafi olarak çoğaltılan veritabanı hesapları için tercih edilen konumları (bölgeleri) tanımlar. Değerler virgülle ayrılmış olmalıdır. Örneğin, East US,South Central US,North Europe.

Tam örnekler için Örnek bölümüne bakın.

Kullanım

İşlev başarıyla çıktığında, giriş belgesinde yapılan tüm değişiklikler otomatik olarak kalıcı hale getirilir.

Cosmos DB giriş bağlaması tarafından desteklenen parametre türü İşlevler çalışma zamanı sürümüne, uzantı paketi sürümüne ve kullanılan C# modalitesine bağlıdır.

İşlevin tek bir belgeyi işlemesini istediğinizde Cosmos DB giriş bağlaması aşağıdaki türlere bağlanabilir:

Type Açıklama
JSON serileştirilebilir türler İşlevler, belgenin JSON verilerini seri durumdan çıkararak düz eski bir CLR nesnesi (POCO) türüne dönüştürmeye çalışır.

İşlevin bir sorgudan birden çok belgeyi işlemesini istediğinizde, Cosmos DB giriş bağlaması aşağıdaki türlere bağlanabilir:

Type Açıklama
IEnumerable<T>burada T JSON serileştirilebilir bir türdür Sorgu tarafından döndürülen varlıkların numaralandırması. Her girdi bir belgeyi temsil eder.
CosmosClient1 Cosmos DB hesabına bağlı bir istemci.
Veritabanı1 Cosmos DB veritabanına bağlı bir istemci.
Kapsayıcı1 Cosmos DB kapsayıcısına bağlı bir istemci.

1 Bu türleri kullanmak için Microsoft.Azure.Functions.Worker.Extensions.CosmosDB 4.4.0 veya sonraki sürümlerine ve SDK türü bağlamalarına yönelik ortak bağımlılıklara başvurmanız gerekir.

Java işlevleri çalışma zamanı kitaplığından @CosmosDBInput ek açıklaması Azure Cosmos DB verilerini işleve sunar. Bu ek açıklama kullanılarak yerel Java türleri, POJO'lar veya null atanabilir değerlerle Optional<T>kullanılabilir.

kullanarak context.extraInputs.get()belgeye erişin.

Belgelerde güncelleştirmeler işlev çıkışında otomatik olarak yapılmaz. bir işlevdeki belgeleri güncelleştirmek için çıkış bağlaması kullanın. Daha fazla ayrıntı için Bkz. PowerShell örneği.

Veriler bir DocumentList parametre aracılığıyla işlevin kullanımına sunulur. Belgede yapılan değişiklikler otomatik olarak kalıcı olmaz.

Bağlantılar

connectionStringSetting/connection ve leaseConnectionStringSetting/leaseConnection özellikleri, uygulamanın Azure Cosmos DB'ye nasıl bağlanması gerektiğini belirten ortam yapılandırmasına başvurulardır. Bunlar şunları belirtebilir:

Yapılandırılan değer hem tek bir ayar için tam eşleşme hem de diğer ayarlar için bir ön ek eşleşmesiyse, tam eşleşme kullanılır.

Connection string

Veritabanı hesabınızın bağlantı dizesi, bağlama yapılandırmasının bağlantı özelliği tarafından belirtilen değerle eşleşen bir adla bir uygulama ayarında depolanmalıdır.

Kimlik tabanlı bağlantılar

Uzantının 4.x veya üzeri bir sürümünü kullanıyorsanız, gizli dizi içeren bir bağlantı dizesi kullanmak yerine uygulamanın bir Microsoft Entra kimliği kullanmasını sağlayabilirsiniz. Bunu yapmak için, tetikleyici ve bağlama yapılandırmasındaki bağlantı özelliğine eşlenen ortak bir ön ek altında ayarları tanımlayabilirsiniz.

Bu modda uzantı aşağıdaki özellikleri gerektirir:

Özellik Ortam değişkeni şablonu Açıklama Örnek değer
Hesap Uç Noktası <CONNECTION_NAME_PREFIX>__accountEndpoint Azure Cosmos DB hesap uç noktası URI'si. <https:// database_account_name.documents.azure.com:443/>

Bağlantıyı özelleştirmek için ek özellikler ayarlanabilir. Bkz. Kimlik tabanlı bağlantılar için ortak özellikler.

Azure İşlevleri hizmetinde barındırıldığında, kimlik tabanlı bağlantılar yönetilen kimlik kullanır. Ve özellikleriyle credential clientID kullanıcı tarafından atanan bir kimlik belirtilse de, sistem tarafından atanan kimlik varsayılan olarak kullanılır. Kullanıcı tarafından atanan kimliği kaynak kimliğiyle yapılandırmanın desteklenmediğini unutmayın. Yerel geliştirme gibi diğer bağlamlarda çalıştırıldığında, bunun yerine geliştirici kimliğiniz kullanılır, ancak bu özelleştirilebilir. Bkz. Kimlik tabanlı bağlantılarla yerel geliştirme.

Kimliğe izin verme

Hangi kimlik kullanılıyorsa, hedeflenen eylemleri gerçekleştirmek için izinlere sahip olmalıdır. Çoğu Azure hizmeti için bu, bu izinleri sağlayan yerleşik veya özel rolleri kullanarak Azure RBAC'de bir rol atamanız gerektiği anlamına gelir.

Önemli

Bazı izinler, tüm bağlamlar için gerekli olmayan hedef hizmet tarafından gösterilebilir. Mümkün olduğunda, kimliğe yalnızca gerekli ayrıcalıkları sağlayarak en az ayrıcalık ilkesine uyun. Örneğin, uygulamanın yalnızca bir veri kaynağından okuyabilmesi gerekiyorsa, yalnızca okuma izni olan bir rol kullanın. Okuma işlemi için aşırı izin olduğundan, bu hizmete yazmaya da izin veren bir rol atamak uygun olmaz. Benzer şekilde, rol atamasının kapsamının yalnızca okunması gereken kaynaklara göre ayarlandığından emin olmak istersiniz.

Cosmos DB, veri işlemleri için Azure RBAC kullanmaz. Bunun yerine, benzer kavramlar üzerine oluşturulmuş bir Cosmos DB yerleşik RBAC sistemi kullanır. Çalışma zamanında veritabanı hesabınıza erişim sağlayan bir rol ataması oluşturmanız gerekir. Sahip gibi Azure RBAC Yönetimi rolleri yeterli değildir. Aşağıdaki tabloda, Azure Cosmos DB uzantısı normal işlemde kullanılırken önerilen yerleşik roller gösterilmektedir. Uygulamanız, yazdığınız koda göre ek izinler gerektirebilir.

Bağlama türü Örnek yerleşik roller1
Tetikleyici2 Cosmos DB Yerleşik Veri Katkıda Bulunanı
Giriş bağlaması Cosmos DB Yerleşik Veri Okuyucusu
Çıkış bağlaması Cosmos DB Yerleşik Veri Katkıda Bulunanı

1 Bu roller Azure RBAC rol atamasında kullanılamaz. Bu rolleri atama hakkında ayrıntılı bilgi için Cosmos DB yerleşik RBAC sistemi belgelerine bakın.

2 Cosmos DB, kimlik kullanırken kapsayıcı oluşturmayı bir yönetim işlemi olarak ele alır. Tetikleyici için veri düzlemi işlemi olarak kullanılamaz. İşlevinizi ayarlamadan önce tetikleyicinin ihtiyaç duyduğu kapsayıcıları (kira kapsayıcısı dahil) oluşturduğunuzdan emin olmanız gerekir.

Sonraki adımlar