我在分区集合(在Azure Cosmos DB中)上有一个存储过程。应该更新给定的文档,或者如果不存在则创建它。由于集合是分区的,因此我需要在执行存储过程以创建文档的范围内使用分区键。
如何从存储过程中获取与请求相关的分区键?
根据文档(Common Azure Cosmos DB REST request headers),分区键的请求标头参数为: x-ms-documentdb-partitionkey 。
有关Request class的服务器端JavaScript SDK的文档说:
Request对象代表发送到 服务器。这包括有关HTTP标头和主体的信息 发送到服务器的HTTP请求。对于触发器,请求 表示运行触发器时正在执行的操作。 例如,如果触发器正在创建时运行(“触发”) 文档,则请求正文包含的JSON正文 要创建的文档。可以通过请求访问 对象和(作为JSON)可以在JavaScript中本地使用。 对于存储过程,该请求包含有关发送来执行存储过程的请求的信息。
我尝试如下从HTTP请求的标头中获取分区键:
getContext().getRequest().getValue('x-ms-documentdb-partitionkey') //returns: "Unable to get property 'value' of undefined or null reference"
getContext().getRequest()['x-ms-documentdb-partitionkey'] //returns: "undefined"
示例代码:
function createOrUpdateSproc(documentId) {
let isAccepted = __.queryDocuments(__.getSelfLink(),
`SELECT * FROM c WHERE c.id = "${documentId}"`,
function (err, feed, options) {
if (err) throw err;
// Check the feed and if empty, create document; otherwise take first element from feed.
if (!feed || !feed.length) {
createDocument();
} else {
replaceDocument(undefined, feed[0]);
}
}
);
if (!isAccepted) throw new Error('Querying refused.');
function createDocument() {
let documentBody = {
id: documentId,
partitionKey: __.request['x-ms-documentdb-partitionkey'], // Based on documentation.
counter: 1
};
let isAccepted = __.createDocument(__.getSelfLink(),
documentBody,
{ disableAutomaticIdGeneration: true },
replaceDocument);
if (!isAccepted) throw new Error('Creating refused.');
}
function replaceDocument(err, document, createOptions) {
...
}
}
答案 0 :(得分:0)
我在sp中使用js代码来打印getRequest()
的结构。
var collection = getContext().getCollection();
var r = getContext().getRequest();
for(var i in r){
console.log(i+"-------");
console.log(r[i]+"++++");
}
但是我得到了下面的结构。
"getx-ms-documentdb-script-enable-logging-------function () {\r\n return getValueInternal(propName);\r\n }++++getValue-------function (propertyName) {\r\n return getValueInternal(propertyName);\r\n }++++"
它与Js API document中提到的属性不匹配。
也许您可以使用Azure Http Trigger Function作为解决方案来实现相同的逻辑业务。只需将分区键作为参数传递给Function,然后使用Function方法中的cosmos db sdk进行查询,创建或更新内容。可以从应用程序,用户或任何其他客户端调用触发函数。