У меня есть хранимая процедура в многораздельной коллекции (в 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) {
...
}
}