Как получить область ключа раздела из хранимой процедуры? - PullRequest
0 голосов
/ 31 января 2019

У меня есть хранимая процедура в многораздельной коллекции (в Azure Cosmos DB).Он должен обновить данный документ или создать его, если он не существует.Поскольку коллекция разделена, мне нужен ключ раздела, в объеме которого выполняется хранимая процедура для создания документа.

Как получить ключ раздела, связанный с запросом, из хранимой процедуры?


На основании документации ( Общие заголовки запросов REST DB Azure Cosmos DB ) параметр заголовка запроса для ключа раздела: x-ms-documentdb-partitionkey .

Документация для серверного JavaScript SDK относительно класса запросов гласит:

Объект запроса представляет сообщение запроса, которое былоотправлено на сервер.Это включает информацию о заголовках 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 голосов
/ 01 февраля 2019

Я использовал код js в sp для печати структуры 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 .

Возможно, вы могли бы использовать Функция триггера Http Azure в качестве обходного пути для реализации того же логического бизнеса.Просто передайте ключ разделения функции в качестве параметров, затем выполните запрос, создайте или обновите содержимое с помощью cosmos db sdk в методе Function.Функцию триггера можно вызывать из приложений, пользователей или любых других клиентских сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...