如何从存储过程中获取分区键作用域?

时间:2019-01-31 19:35:08

标签: javascript stored-procedures azure-cosmosdb

我在分区集合(在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) {
        ...
    }
}

1 个答案:

答案 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进行查询,创建或更新内容。可以从应用程序,用户或任何其他客户端调用触发函数。