Azure Functions 的 Azure DocumentDB 输出绑定

重要

Azure DocumentDB 扩展目前处于预览阶段。 目前仅支持使用 旧进程内模型的 .NET 应用。

Azure DocumentDB 的输出绑定允许你从你的 Azure Functions 中为 Azure DocumentDB 集合写入新文档。 本文将解释如何配置和使用输出绑定,包括编写文档到数据库的代码示例。

先决条件

Example

本示例展示了HTTP请求的 POST 触发函数。 请求在请求正文中获得期望 string 值。 然后输出绑定会将文档添加到集合中。

using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extensions.AzureCosmosDb.Mongo;
using MongoDB.Bson;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Mvc;

public static class DocumentDBOutput
{
    [FunctionName(nameof(DocumentDBOutput))]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "POST", Route = null)]
        string payload,
        [CosmosDBMongo(databaseName: "<database-name>",
                        collectionName: "<collection-name>",
                        ConnectionStringSetting = "<name-of-app-setting>")]
        IAsyncCollector<BsonDocument> collector,
        ILogger logger)
    {
        logger.LogInformation("C# Azure DocumentDB output function starting.");

        BsonDocument document = new()
        {
            { "message", payload },
            { "originator", nameof(DocumentDBOutput) },
            { "timestamp", BsonDateTime.Create(System.DateTime.UtcNow) }
        };

        await collector.AddAsync(document);

        return new OkObjectResult("Document added successfully.");
    }
}

或者,使用C#记录或类类型来表示添加到集合中的文档:

using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extensions.AzureCosmosDb.Mongo;
using MongoDB.Bson;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Mvc;
using MongoDB.Bson.Serialization.Attributes;

public static class DocumentDBOutput
{
    [FunctionName(nameof(DocumentDBOutput))]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "POST", Route = null)]
        ProductDocument payload,
        [CosmosDBMongo(databaseName: "<database-name>",
                        collectionName: "<collection-name>",
                        ConnectionStringSetting = "<name-of-app-setting>")]
        IAsyncCollector<ProductDocument> collector,
        ILogger logger)
    {
        logger.LogInformation("C# Azure DocumentDB output function starting.");

        await collector.AddAsync(payload);

        return new OkObjectResult("Document added successfully.");
    }
}

public sealed record ProductDocument(
    [property: BsonId]
    [property: BsonRepresentation(BsonType.ObjectId)] string id,
    string name,
    string category,
    int quantity,
    decimal price,
    bool sale
);

特性

下表描述了属性的 CosmosDBMongoTrigger 绑定配置属性。

参数 Description
FunctionId (可选)触发器函数的 ID。
DatabaseName 输出数据所针对的数据库名称。
CollectionName 数据库中针对输出数据的集合名称。
ConnectionStringSetting 指定如何连接到针对输出数据的Azure DocumentDB集群的应用设置或设置集合名称。
CreateIfNotExists (可选)当设置为 true时,如果目标集合还不存在,则会创建该集合。

Usage

使用属性 CosmosDBMongo 将一组文档插入可能不存在的集合中:

[FunctionName(nameof(DocumentDBOutput))]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "POST", Route = null)]
    BsonDocument payload,
    [CosmosDBMongo(databaseName: "<database-name>",
                    collectionName: "products",
                    ConnectionStringSetting = "<name-of-app-setting>",
                    CreateIfNotExists = true)]
    IAsyncCollector<BsonDocument> collector,
    ILogger logger)
{
    logger.LogInformation("C# Azure DocumentDB output function starting.");

    await collector.AddAsync(payload);

    return new OkObjectResult("Document added successfully.");
}

或者,直接在函数代码中与 MongoDB 客户端 协作:

[FunctionName(nameof(DocumentDBOutput))]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "POST", Route = null)]
    BsonDocument payload,
    [CosmosDBMongo(ConnectionStringSetting = "<name-of-app-setting>")]
    IMongoClient client,
    ILogger logger)
{
    logger.LogInformation("C# Azure DocumentDB function got a client.");

    IMongoDatabase database = client.GetDatabase("<database-name>");

    IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("<collection-name>");

    await collection.InsertOneAsync(payload);

    return new OkObjectResult("Document added successfully.");
}