Azure Functions 的 Azure DocumentDB 输入绑定

重要

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

Azure Functions 中的 Azure DocumentDB 输入绑定允许你从数据库中检索一个或多个文档。 本文将解释如何配置和使用C#代码示例中的输入绑定,包括查询集合以及使用MongoDB客户端。

先决条件

Example

本示例展示了HTTP请求的 GET 触发函数。 该函数随后使用输入绑定查询目标 Azure DocumentDB 集合,寻找符合过滤器 { "price": { "$gte": 150 }}的文档:

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

public static class DocumentDBInput
{
    [FunctionName(nameof(DocumentDBInput))]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "GET", Route = null)]
        HttpRequest request,
        [CosmosDBMongo(databaseName: "<database-name>",
                        collectionName: "<collection-name>",
                        ConnectionStringSetting = "<name-of-app-setting>",
                        QueryString = "{{ \"price\": {{ \"$gte\": 150 }} }}")]
        IEnumerable<BsonDocument> documents,
        ILogger logger)
    {
        logger.LogInformation("C# Azure DocumentDB function queried a collection.");

        return new OkObjectResult(documents);
    }
}

或者,可以使用 C# 记录或类类型来表示从集合返回的文档:

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

public static class DocumentDBInput
{
    [FunctionName(nameof(DocumentDBInput))]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "GET", Route = null)]
        HttpRequest request,
        [CosmosDBMongo(databaseName: "<database-name>",
                        collectionName: "<collection-name>",
                        ConnectionStringSetting = "<name-of-app-setting>",
                        QueryString = "{{ \"price\": {{ \"$gte\": 150 }} }}")]
        IEnumerable<ProductDocument> products,
        ILogger logger)
    {
        logger.LogInformation("C# Azure DocumentDB function queried a collection.");

        return new OkObjectResult(products);
    }
}

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 集群的应用设置或设置集合名称。
QueryString 定义输入绑定从数据库返回文档使用的 Mongo 查询表达式。 查询支持 Azure Functions 绑定参数。

注释

QueryString为了满足 Azure 函数内置的参数绑定,参数需要用双卷括号来避开。 更多信息请参见 结合表达式和模式

Usage

使用属性 CosmosDBMongo 从集合中检索一组文档:

[FunctionName(nameof(DocumentDBInput))]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "GET", Route = null)]
    HttpRequest request,
    [CosmosDBMongo(databaseName: "<database-name>",
                    collectionName: "<collection-name>",
                    ConnectionStringSetting = "<name-of-app-setting>")]
    IEnumerable<BsonDocument> documents,
    ILogger logger)
{
    logger.LogInformation("C# Azure DocumentDB function queried a collection.");

    return new OkObjectResult(documents);
}

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

[FunctionName(nameof(DocumentDBInput))]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "GET", Route = null)]
    HttpRequest request,
    [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>");

    BsonDocument filter = []; // Empty filter to get all documents

    long count = await collection.CountDocumentsAsync(filter);

    return new OkObjectResult(new
    {
        documentsInCollection = count
    });
}