Первый вопрос:
Если бы я поместил эти два документа в один контейнер, могу ли я использовать триггер для такого расчета?
Да, вы можете это сделать Но ваш двухтипный документ должен находиться в одном логическом разделе. Причину этого см. в Транзакции .
Третий вопрос:
Любой другой рекомендации передовой практики? На сервере SQL я бы просто использовал вычисляемый столбец или триггер.
Если вы знакомы с функциями Azure, вы можете использовать их для вычислений. В cosmos DB, если вы хотите вызвать триггер, вы должны установить requestOption
следующим образом:
ItemRequestOptions request = new ItemRequestOptions
{
PreTriggers = new List<string> { "insertValue" }
};
ItemResponse<Users> userResponse = await this.container.CreateItemAsync<Users>(user, null, request);
Если вы используете функцию Azure, вам не нужно устанавливать requestOption
.
Ниже мой тестовый код запуска (я уже вставляю документ с настройками):
function insertValue(){
var context = getContext();
var container = context.getCollection();
var request = context.getRequest();
var multiplier;
// item to be created in the current operation
var itemToCreate = request.getBody();
var name = itemToCreate.name;
var filterQuery = 'SELECT * FROM users u WHERE u.name = "' + name +'" and u.multiplier != null';
var accept = container.queryDocuments(container.getSelfLink(), filterQuery,
updateMetadataCallback);
if(!accept) throw "Unable to find document, abort";
function updateMetadataCallback(err, items, responseOptions) {
if(err) throw new Error("Error" + err.message);
if(items.length != 1) throw 'Unable to find document';
var userItem = items[0];
multiplier = userItem.multiplier;
// update metadata
if(multiplier){
itemToCreate["Value"] = multiplier * itemToCreate["age"];
request.setBody(itemToCreate);
}
}
}
Надеюсь, это поможет вам.