使用命令式绑定在 Cosmos DB 中添加文档

Using imperative binding for adding documents in Cosmos DB

我正在使用 Azure Functions 并想对我的 Cosmos DB 存储库使用 imperative binding

起初我在 Run-method 中这样定义了我的输出参数:

[DocumentDB("TablesDB", "minified-urls", ConnectionStringSetting = "CosmosConnectionString", CreateIfNotExists = true)] out MinifiedUrl minifiedUrl,

效果很好。

但我宁愿使用命令式绑定,所以我可以动态定义绑定中使用的值。

我尝试的第一件事是这个,它不起作用,因为你需要设置 ConnectionStringSetting

var output = await binder.BindAsync<MinifiedUrl>(new DocumentDBAttribute("TablesDB", "minified-urls"));

因此将这段绑定更改为以下内容应该可行,至少我是这么想的。

var output = await binder.BindAsync<MinifiedUrl>(new DocumentDBAttribute("TablesDB", "minified-urls")
{
    CreateIfNotExists = true,
    ConnectionStringSetting = "CosmosConnectionString"
});

当你这样做时,活页夹抱怨缺少 Id 属性 如果你填写这个 Id 属性 你还需要设置 PartitionKey.

所以最后这就是我想出的。

var output = await binder.BindAsync<MinifiedUrl>(new DocumentDBAttribute("TablesDB", "minified-urls")
{
    CreateIfNotExists = true,
    ConnectionStringSetting = "CosmosConnectionString",
    Id = Guid.NewGuid().ToString(),
    PartitionKey = DateTime.UtcNow.Year.ToString()
});

因为我想在存储库中创建一个新文档,活页夹找不到东西,所以 output 变量是 null.

所以,我想知道如何进行?声明性绑定工作正常,但我不知道如何让这个命令工作。

您的问题来自这样一个事实,即运行时将您的命令式绑定解释为输入绑定。那是因为您正在请求自定义类型 (MinifiedUrl),所以这个值应该从数据库 加载 是有道理的。

要生成绑定输出,您应该请求 IAsyncCollector 类型,然后对其调用 AddAsync

var output = await binder.BindAsync<IAsyncCollector<MinifiedUrl>>(
    new DocumentDBAttribute("TablesDB", "minified-urls")
    { 
        CreateIfNotExists = true,
        ConnectionStringSetting = "CosmosConnectionString"
    });
await output.AddAsync(new MinifiedUrl(...));

或者,甚至不必为将输出绑定到 Document Db 而烦恼。我发现输出绑定编程模型和 api 比您尝试使用的服务的实际客户端 sdk(在本例中为文档 db)强大得多。

如果您将 Document db 端点和密钥设置为您的应用程序设置,那么您只需在 azure 函数中实例化一个 document db 客户端(您需要拥有 document db nuget),然后您就拥有了完整的控制你想做什么而不用担心输出绑定的尴尬符号和属性..