Как передать список объектов в качестве параметра хранимым процедурам Azure CosmosDB (DocumentDB)? - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь выполнить массовое обновление в одной из моих коллекций (скажем, на страницах).Я создал для этого хранимую процедуру, которая прекрасно работает при запуске из Azure.Но проблема возникает, когда я выполняю это через REST API.

Когда я передаю список объектов в функцию хранимой процедуры, это похоже на получение только первого объекта.

Это мой SP для массового обновления

function bulkImport(docs) {
if(typeof docs==="string")
    docs= JSON.parse(docs);
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var count=0;
// Validate input.
if (!docs) throw new Error("The array is undefined or null.");
var docsLength = docs.length;
if (docsLength == 0) {
    getContext().getResponse().setBody(0);
}
tryUpdate(docs[count], callback);
function tryUpdate(doc, callback) {
    var requestOptions = { etag: doc._etag };
   var isAccepted = collection
                     .replaceDocument(doc._self,
                                      doc,
                                      requestOptions,
                                      callback);        
    if (!isAccepted) getContext().getResponse().setBody(count);
}
function callback(err, doc, options) {
    if (err) throw err;
    count++;

    if (count >= docsLength) {
        getContext().getResponse().setBody(count);
    } else {
        tryUpdate(docs[count], callback);
    }
}

I 'используя RestSharp в качестве http-клиента для выполнения REST-запроса.

public static IRestResponse ExecuteStoredProcedure(string sprocs, string dbName, string colls, string key, string baseurl, string api_Version, string parameter)
    {
        //REST API URL Replace Document By Id PUT https://{databaseaccount}.documents.azure.com/dbs/{db-id}/colls/{coll-id}/docs/{doc-name}
        var client = new RestClient(baseurl + "dbs/" + dbName + "/colls/" + colls + "/sprocs/" + sprocs);
        //using getRquest() to Adding Header to the request
        var request = GetRequest(api_Version, Method.POST, dbName, colls, key,
            "dbs/" + dbName + "/colls/" + colls + "/sprocs/" + sprocs, "sprocs");
        request.AddParameter("undefined", parameter, ParameterType.RequestBody);
        return Execute(client, request);
    }

Это мои примеры данных, которые передаются в качестве параметра вышеупомянутой функции

[{
    "id": "somestring",
    "query": {},
    "createdDate": "",
    "updatedDate": "",
    "createdBy": "Sai",
    "updatedBy": "Sai",
    "_rid": "somevalue",
    "_self": "somevalue,
    "_etag": "somevalue",
    "_attachments": "attachments/",
    "_ts": 0
},
{
    "id": "someid",
    "query": {},
    "createdDate": "",
    "updatedDate": "",
    "createdBy": "Sai",
    "updatedBy": "Sai",
    "_rid": "somevalue",
    "_self": "somevalue,
    "_etag": "somevalue",
    "_attachments": "attachments/",
    "_ts": 0
}

]

В SP, если я сделаю

docs[0]._etag

я получаю ошибку как неопределенную

Сведения об исключении

{
"code": "BadRequest",
"message": "Message: {\"Errors\":[\"Encountered exception while executing Javascript. Exception = TypeError: Unable to get property '_etag' of undefined or null reference\\r\\nStack trace: TypeError: Unable to get property '_etag' of undefined or null reference\\n   at tryUpdate (bulkUpdatePage.js:21:9)\\n   at bulkImport (bulkUpdatePage.js:13:5)\\n   at __docDbMain (bulkUpdatePage.js:55:5)\\n   at Global code (bulkUpdatePage.js:1:2)\"]}\r\nActivityId: 358544ea-07ee-45fd-9612-65295aa36900, Request URI: /apps/97eda9fb-4d31-43ec-816e-e341bfd2b031/services/962b1d52-8e1c-4d3a-a20e-1dc6ddca59f5/partitions/a75f0fb5-bd14-46a4-b0bb-a35e3cb3a2be/replicas/131823537009439236p, RequestStats: \r\nRequestStartTime: 2018-10-24T07:53:42.4855657Z, Number of regions attempted: 1\r\n, SDK: Microsoft.Azure.Documents.Common/2.0.0.0"

}

Пожалуйста, помогите, я заблокирован,Я что-то упустил?

Заранее спасибо !!

1 Ответ

0 голосов
/ 25 октября 2018

Я получил решение для этого и оставил это здесь, чтобы я мог помочь кому-то в будущем

На уровне REST тело запроса sproc является массивом параметров функции sproc, каждый элемент в этом массиве является отдельнымаргумент для sproc.Если вам нужно, чтобы массив документов был первым параметром, добавьте еще один [], то есть используйте что-то вроде этого: [[{"id": 1}, {"id": 2}]].Общая подсказка для REST: используйте Fiddler и посмотрите, что передается по проводам, когда вы используете REST и выполняете тот же API формы (используя протокол соединения = https) или DocumentDBStudio.

спасибо,

Счастливое кодирование

...