我正在尝试将单个记录插入到分区键为/newpart
为了确保我正在解释分区键是什么,我假设它是这里显示的值。
在该集合中,我有一个名为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
。这是同一个集合,因此我尝试将文档插入到同一个分区键(?)中。
然而,错误表明不然。
答案 0 :(得分:2)
当从客户端执行存储过程时,RequestOptions指定分区键,存储过程将在此分区的上下文中运行,并且无法在具有不同分区键值的文档上运行(例如,创建)。
您可以做的是从客户端为每个分区键执行存储过程。例如,如果存储过程是批量创建文档,则可以按分区键对文档进行分组,并将每个组(可以并行完成)发送到存储过程,在RequestOptions中提供分区键值。这会有帮助吗?
您不必为每个分区键创建存储过程,只需创建一次而不提供分区键。
根据您的代码,您似乎正在尝试插入没有分区密钥的文档,并且它会在没有分区密钥的文档的特殊分区中进行分组。
希望它对你有所帮助。
更新
请修改您的代码,如下所示:
data = {"name":"Ben","age":30,"city":"New York","newpart":"11"}
client.ExecuteStoredProcedure('dbs/db/colls/newcoll/sprocs/createMyDocument', data , {"partitionKey": "11"})
由于您的集合具有分区键集,因此要插入的文档必须设置分区键,否则数据库将不知道将其放入哪个分区。
当然,文档中设置的分区键也应该与存储过程执行时设置的分区键一致,否则会出现上述问题。因为您只能操作在执行存储过程时设置的分区。