运行存储过程时的分区键错误

时间:2017-10-27 05:36:21

标签: python python-2.7 azure stored-procedures azure-cosmosdb

我正在尝试将单个记录插入到分区键为/newpart

的集合中

为了确保我正在解释分区键是什么,我假设它是这里显示的值。

enter image description here

在该集合中,我有一个名为createMyDocument的存储过程,其中包含

function createMyDocument(documentToCreate) {
    var context = getContext();
    var collection = context.getCollection();

    var accepted = collection.createDocument(collection.getSelfLink(),
          documentToCreate,
          function (err, documentCreated) {
              if (err) throw new Error('Error' + err.message);
              context.getResponse().setBody(documentCreated.id)
          });
    if (!accepted) return;
}

我用Python调用它:

config = {
    'ENDPOINT': 'deleted',
    'MASTERKEY': 'deleted',
    'DOCUMENTDB_DATABASE': 'database',
    'DOCUMENTDB_COLLECTION': 'newup'
};

client = document_client.DocumentClient(config['ENDPOINT'], {'masterKey': config['MASTERKEY'] ,'DisableSSLVerification' : 'true'  })
data = {"name":"Ben","age":30,"city":"New York"}
client.ExecuteStoredProcedure('dbs/database/colls/newup/sprocs/createMyDocument', data, {"partitionKey" : "/newpart"})

返回的错误是 Requests originating from scripts cannot reference partition keys other than the one for which client request was submitted

所以我对错误消息感到困惑,因为存储过程(据我所知)存储在集合中,分区键为/newpart。这是同一个集合,因此我尝试将文档插入到同一个分区键(?)中。 然而,错误表明不然。

1 个答案:

答案 0 :(得分:2)

当从客户端执行存储过程时,RequestOptions指定分区键,存储过程将在此分区的上下文中运行,并且无法在具有不同分区键值的文档上运行(例如,创建)。

您可以做的是从客户端为每个分区键执行存储过程。例如,如果存储过程是批量创建文档,则可以按分区键对文档进行分组,并将每个组(可以并行完成)发送到存储过程,在RequestOptions中提供分区键值。这会有帮助吗?

您不必为每个分区键创建存储过程,只需创建一次而不提供分区键。

根据您的代码,您似乎正在尝试插入没有分区密钥的文档,并且它会在没有分区密钥的文档的特殊分区中进行分组。

此外,您可以参考此主题:Azure DocumentDB - Requests originating from scripts cannot reference partition keys other than the one for which client request was submitted

希望它对你有所帮助。

更新

请修改您的代码,如下所示:

data = {"name":"Ben","age":30,"city":"New York","newpart":"11"}

client.ExecuteStoredProcedure('dbs/db/colls/newcoll/sprocs/createMyDocument', data , {"partitionKey": "11"})

由于您的集合具有分区键集,因此要插入的文档必须设置分区键,否则数据库将不知道将其放入哪个分区。

当然,文档中设置的分区键也应该与存储过程执行时设置的分区键一致,否则会出现上述问题。因为您只能操作在执行存储过程时设置的分区。