azure - DocumentDb 上的文档未被替换

标签 azure f# azure-cosmosdb

我正在使用 Azure 的 DocumentDb使用 F#,我已经能够创建新文档、加载所有文档以及通过 Id(使用 where)加载文档。应用过滤器。但我无法替换任何文档,并且 F# 中的文档非常少。

这是我用来更新文档的函数:

let update (c : MyObject) =
    let cli = createClient()
    cli.ReplaceDocumentAsync(documentUri(), c)
    |> Async.AwaitTask
    |> ignore
    c

createClient只需创建 DocumentClient 的新实例,使用相同的参数让我加载和保存新文档。同样,documentUri()适用于其他功能。

我的猜测是,我实际上从任务中得到了有用的响应,但我忽略了它(基于我见过的示例)。然而,事实证明,想要得到这样的回应是很困难的。

这是我尝试使用的一种方法,但最终得到了一种我似乎无法转换的类型:

let update2 ( c : MyObject) =
    let cli = createClient()
    let updatedDoc = async {
        return! cli.ReplaceDocumentAsync(documentUri(), c) |> Async.AwaitTask
    }
    updatedDoc

在这里,updatedDoc类型为Async<ResourceResponse<Document>> 。我似乎找不到办法将其从Async中取出包装器,一旦我这样做了,我不知道如何转动 Document进入MyObject .

所以,总结一下:

  • 问题是我无法更新文档
  • 我怀疑我在任务中收到了错误消息或某些被我忽略的内容。

最佳答案

F# async 计算与 C# Task 不同,因为它们不会立即执行。简单地创建一个异步计算不会执行任何操作:

let x = async { printfn "Foo!" }  // No output is generated here

为了实际运行它,您需要指定如何运行它:将其调度到线程池上、在当前线程上同步运行、转换为任务 等。例如:

let x = async { printfn "Foo!" }
Async.RunSynchronously x // Prints "Foo!"

或者,可以通过将异步计算包含在另一个异步计算中来“运行”异步计算,然后该异步计算本身会以某种方式执行:

let y = async {
     do! x
     printfn "Bar!"
   }

Async.RunSynchronously y  // Prints "Foo!" and then "Bar!"

因此,为了执行第二个示例(并希望看到返回的错误),您需要实际运行生成的工作流程:

let update2 ( c : MyObject) =
    let cli = createClient()
    let updateDoc = cli.ReplaceDocumentAsync(documentUri(), c) |> Async.AwaitTask
    Async.RunSynchronously updateDoc

关于azure - DocumentDb 上的文档未被替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43454358/

相关文章:

php - 从 Azure 网站中的 Blob 存储获取损坏的图像

azure - Azure 应用程序中缺少“应用程序服务日志”选项

asp.net-web-api - 如何在 Giraffe 中启用 CORS?

asynchronous - 定位 Microsoft.FSharp.Control.Trampoline 抛出的异常

azure - 不同的关键字在 Azure cosmos DB 中未按预期工作

azure - Terraform 将 Cosmos 数据库连接字符串传递到 KeyVault

Azure Function App - 使用 Terraform 配置 "Deployment Center"

azure - 发送/传递的 Azure 服务总线主题订阅消息的日志在哪里?

f# - F# 是否提供任何未订购的 map /字典?

azure - CosmosDB触发器 : Object reference not set to an instance of an object