【问题标题】:Cosmos DB - Why partition key has to be mentioned when making point queries using sql api SDK?Cosmos DB - 为什么在使用 sql api SDK 进行点查询时必须提到分区键?
【发布时间】:2020-01-18 04:16:31
【问题描述】:

为什么在使用 sql api SDK 对分区集合进行点查询时必须提到分区键?

有没有办法使用 sql api SDK 对分区集合执行点查询而不提及“PartitionKey”?因为它是点查询。

工作示例:
// - db_id 是数据库的 ID 属性
// - coll_id 是 DocumentCollection 的 ID 属性
// - doc_id 是要读取的文档的 ID 属性。
var docUri = UriFactory.CreateDocumentUri("db_id", "coll_id", "doc_id");
等待 docClient.ReadDocumentAsync(docUri, new RequestOptions { PartitionKey = new PartitionKey(actualId) });

非工作示例: var docUri = UriFactory.CreateDocumentUri("db_id", "coll_id", "doc_id");
等待 docClient.ReadDocumentAsync(docUri);

以下没有分区键的查询失败并显示错误消息:“必须为此操作提供分区键值。”

为什么针对分区集合的点查询需要提到分区键?

【问题讨论】:

    标签: azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    PartitionKey 是强制性的,当您创建帐户时,系统会要求您提供 Partition Key。它用于分片并充当数据的逻辑分区,为 Cosmos DB 提供了分布数据的自然边界across partitions。所以它是随设计而来的。

    因此,每当您使用 SDK 从 cosmosdb 查询数据时,都需要传递 PartitionKey

    之所以需要 ParitionKey,是因为 CosmosDB 在找到数据之前不会解析查询。

    【讨论】:

    • 这就是为什么你需要传递partitionKey
    • 谢谢,我明白分区键的作用了。但是我的查询是关于使用点查询发出数据库请求时是否需要分区查询。例如 "SELECT * FROM c WHERE c.id = "foo" 如果 "id" 是分区键,它已经是查询的一部分,我仍然必须明确提到 id 是分区,而我 sql api SDK?
    • 是的,您需要明确提及,因为 cosmosdb 的工作方式是首先确定数据的位置,然后执行查询。
    • 但是通过 msdn url "docs.microsoft.com/en-us/dotnet/api/…" 不需要提及分区键。当我在我的应用程序中对分区集合使用相同的代码时,它会失败,但对于非分区集合它可以工作,如何?为什么?请
    • 所有答案都在上面的答案中。我不知道如何解释更多
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2019-09-26
    相关资源
    最近更新 更多