Хранимая процедура Azure CosmosDb IfMatch Predicate - PullRequest
0 голосов
/ 18 ноября 2018

В хранимой процедуре DocDb, в качестве первого шага в процессе извлечения данных, которые я мутирую, я читаю, а затем использую данные, если они соответствуют etag следующим образом:

collection.readDocument(reqSelf, function(err, doc) {
    if (doc._etag == requestEtag) {
        // Success - want to update
    } else {
        // CURRENTLY: Discard the read result I just paid lots of RUs to read 
        // IDEALLY: check whether response `options` or similar indicates retrieval
                    was skipped due to doc not being present with that etag anymore 
        ...
        // ... Continue with an alternate strategy
    }
});

Есть лиспособ передать options на readDocument вызов так, что обратный вызов будет проинформирован: «Он изменен, поэтому мы не получили его, как вы и просили»?

(Моя настоящая проблема заключается в том, чтоЯ не могу найти никакой документации, кроме недокументирования readDocument в документации js-сервера )

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Технически вы можете сделать это, создав объект responseOptions и передав его вызову.

function sample(selfLink, requestEtag) {
    var collection = getContext().getCollection();

    var responseOptions = { accessCondition: { type: "IfMatch", condition: requestEtag } };

    var isAccepted = collection.readDocument(selfLink, responseOptions, function(err, doc, options) {
        if(err){
            throw new Error('Error thrown. Check the status code for PreconditionFailed errors');
        }

        var response = getContext().getResponse();
        response.setBody(doc);

    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

Однако, даже если указанный вами etag не тот, который есть в документе, вы выигралине получите ошибку, и вы вернете сам документ.Это просто не должно работать с этим, используя функцию readDocument в хранимой процедуре.

0 голосов
/ 19 ноября 2018

Благодаря некоторому давлению со стороны @Nick Chapsas и этого самостоятельного ответа от @ Redman Я понял, что в моем случае я могу достичь своей цели (либо прочитайте текущий документ с помощью собственной ссылки, или более новый, который заменил его, несущий тот же id), вместо этого сгенерировав ссылку Alt в хранимой процедуре, например:

var docId = collection.getAltLink() + "/docs/"+req.id;
var isAccepted = collection.readDocument(docId, {}, function (err, doc, options) {
    if (err) throw err;
    // Will be null or not depending on whether it exists
    executeUpsert(doc);
});
if (!isAccepted) throw new Error("readDocument not Accepted");
...