【问题标题】:Cosmos DB Stored procedure did not execute without PartitionKeyCosmos DB 存储过程在没有 PartitionKey 的情况下无法执行
【发布时间】:2018-04-26 13:42:31
【问题描述】:

我有一个包含 PartitionKey 的集合。我创建了一个接受查询作为参数的存储过程。在这个存储过程中,我正在获取一些要更新的文档,但是在获取它时显示一个错误,说当我使用该方法时提供 PartitionKey

public Task<StoredProcedureResponse<TValue>> ExecuteStoredProcedureAsync<TValue>(Uri storedProcedureUri, [Dynamic(new[] { false, true })] params dynamic[] procedureParams);

使用其他方法时

public Task<StoredProcedureResponse<TValue>> ExecuteStoredProcedureAsync<TValue>(string storedProcedureLink, RequestOptions options, [Dynamic(new[] { false, true })] params dynamic[] procedureParams);

在这种方法中,我将 PartitionKey 作为

new RequestOptions { PartitionKey = new PartitionKey(Undefined.Value)

在存储过程中使用此 RequestOptions 时,不会获取任何文档。

function ABC(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
// Validate input.
if (!query) throw new Error("The query is undefined or null.");

tryQueryAndDelete();

function tryQueryAndDelete(continuation) {
    var requestOptions = { continuation: continuation };

    var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, retrievedDocs, responseOptions) {
        if (err) throw err;

        if (retrievedDocs.length > 0) {
           console.log("Doc Found");
        } else {
           console.log("Doc not Found");

        }
    });
}

}

有没有这样我可以在不传递 PartitionKey 的情况下获取文档?

【问题讨论】:

  • 嗨,现在有更新吗?
  • 根据您在聊天中的建议,我必须获取所有文档,更新属性,然后再次保存每个文档分区键,它以这种方式工作。@JayGong
  • 太棒了!您可以标记答案以供其他人参考。谢谢

标签: azure azure-cosmosdb


【解决方案1】:

如果注册存储过程的集合是 单分区集合,则事务范围为所有 集合中的文档。如果集合是分区的, 然后存储过程在一个事务范围内执行 单个分区键。然后每个存储过程执行必须 包括与范围对应的分区键值 事务必须在下运行。

你可以参考上面提到here的描述。

无法通过将分区键设置为Undefined.Value 来逃避上述规则。在分区集合中执行存储过程时必须提供分区键。

无论如何,我可以在不通过 分区键?

您可以在执行查询sql时在FeedOptions参数中设置EnableCrossPartitionQuerytrue。(存在性能瓶颈)。

希望对你有帮助。

【讨论】:

  • 没有找到任何采用 FeedOptions 的 ExecuteStoredProcedureAsync 被覆盖的方法。我需要在存储过程 requestOptions 中将 EnableCrossPartitionQuery 传递给 true 吗? @jay龚
  • @SatyaraySingh no no,EnableCrossPartitionQuery 是 FeedOptions 中的一个属性,而不是 RequestOptions。所以,无论如何,你必须提供分区键来执行存储过程。
  • DocumentClient 类中有 4 个重写方法 ExecuteStoredProcedureAsync 来执行存储过程,但它们都没有 FeedOptions 作为参数。那只是意味着我不能在存储过程中这样做吗? @jay龚
  • @SatyaraySingh 是的。您没有任何获取分区键的途径?
  • @fascynacja 当然,您必须通过 sdk 创建未分区的集合,而不是在门户上。刚才搜了一下,在传送门的cosmos db的创建标签上找不到任何语句。我记得那边有个建议给你。无论如何,在sdk中做。在 sdk 中创建集合时不要设置分区键。
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 2019-08-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2016-09-28
相关资源
最近更新 更多