Как сначала получить весь документ, затем внести изменения и сохранить весь документ - PullRequest
0 голосов
/ 01 июня 2019

Я новичок в cosmos db и создаю базу проекта на cosmos db. Я создал базовую операцию crud. Теперь проблема в том, что у пользователя больше работы, у работы может быть другая категория, а в каждой категории - другая работа.

Пример кода дополнения:

public async Task < Catalog > AddAsync(Guid id,
    user order) {
    var requestOptions =
        new RequestOptions {
            PartitionKey = new PartitionKey(order.Id.ToString())
        };

    catalogDocument = await _cosmosClient.UpsertDocumentAsync(
        UriFactory.CreateDocumentCollectionUri(
            _azureCosmosDbOptions.Value.DatabaseId, "list"), order, requestOptions);

    return (user)((dynamic) catalogDocument.Resource);
}

Json тело:

 "id": "8000003c-0001-fb00-b63f-84710c7967aa",

    "work": {

      "category": [
        {

          "subcategory": [
            {
               "work" :{
                    "id":"22",
                   "dec":"one work"
                }

json body input:

 "id": "8000003c-0001-fb00-b63f-84710c7967aa",

    "work": {

      "category": [
        {

          "subcategory": [
            {
               "work" :{
                    "id":"23",
                   "dec":"two work"
                }

фактическая мощность:

 "id": "8000003c-0001-fb00-b63f-84710c7967aa",

    "work": {

      "category": [
        {

          "subcategory": [
            {
               "work" :{
                    "id":"23",
                   "dec":"two work"
                }

Но ожидаемый результат:

 "id": "8000003c-0001-fb00-b63f-84710c7967aa",

    "work": {

      "category": [
        {

          "subcategory": [
            {
               "work" :{
                    "id":"22",
                   "dec":"one work"
                },
                "work" :{
                    "id":"23",
                   "dec":"two work"
                }

Мне нужно обновить без перезаписи моей базы данных. Например, work1 уже завершился, после ввода work2 в моем списке должно быть два набора рабочих данных. Пожалуйста, дайте мне несколько идей спасибо

1 Ответ

0 голосов
/ 27 июня 2019

Если я правильно понимаю, вы ищете частичное обновление. Azure cosmos db не поддерживает частичные обновления. Хотя вы можете использовать хранимую процедуру для обновления всего документа.

function updateSproc(id, update) {
    var collection = getContext().getCollection();
    var collectionLink = collection.getSelfLink();
    var response = getContext().getResponse();

    tryQueryAndUpdate();

    function tryQueryAndUpdate(continuation) {
        var query = {query: "select * from root r where r.id = @id", parameters: [{name: "@id", value: id}]};
        var requestOptions = {continuation: continuation};

        var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, documents, responseOptions) {
            if (err) throw err;

            if (documents.length > 0) {
                tryUpdate(documents[0]);
            } else {
                throw new Error("Document not found.");
            }
        });
    }

function tryUpdate(document) {
    var requestOptions = {etag: document._etag};

    var fields, i;

    fields = Object.keys(update);
    for (i = 0; i < fields.length; i++) {
       document[fields[i]] = update[fields[i]];
    }

    var isAccepted = collection.replaceDocument(document._self, document, requestOptions, function (err, updatedDocument, responseOptions) {
        if (err) throw err;
        response.setBody(updatedDocument);
    });
}

Надеюсь, это поможет.

...