Как обновить определенное значение в вложенном документе в cosmos db с помощью функции Azure с помощью TypeScript

#node.js #json #typescript #azure-functions #azure-cosmosdb

#node.js #json #typescript #azure-функции #azure-cosmosdb

Вопрос:

Мне нужно обновить определенное значение (statutProduit) в вложенном документе в коллекции документов в cosmos DB, используя функцию HttpTrigger Azure, которая принимает в качестве параметра идентификатор документа (id) и идентификатор вложенного документа (EAN), которые я хочу обновить.

Документ похож на приведенный ниже документ

 {
    "id": "b30ca49d-79ee-445c-a2d7-fff776fc95b8",
    "iduser": "21969186-6f25-4927-a140-80f9529b24e3",
    "statutCmd": 0,
    "produits": [
        {
            "EAN": 8002470085353,
            "statutProduit": 0,
            "quantite": 4
        },
        {
            "EAN": 3672762789023,
            "statutProduit": 1,
            "quantite": 3
        }
    ],
    "_rid": "M7ArAL-mcfgRAAAAAAAAAA==",
    "_self": "dbs/M7ArAA==/colls/M7ArAL-mcfg=/docs/M7ArAL-mcfgRAAAAAAAAAA==/",
    "_etag": ""7f00af77-0000-0e00-0000-5f6e01bf0000"",
    "_attachments": "attachments/",
    "statutProduit": 2,
    "_ts": 1601044927
}
  

Я новичок в typescriot, ниже приведен код, который у меня есть до сих пор…

 import { SqlQuerySpec } from "@azure/cosmos";
import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { CosmosClient } from "@azure/cosmos";  
                            
const httpTrigger: AzureFunction = async function(context: Context, req: HttpRequest): Promise<void> {
  try {
       
      const id: string = req.params.id;
      const EAN: string = req.params.EAN;
     
      const newStatut = req.body.statutProduit;
 
      const client = new CosmosClient(process.env.CONNECTION_STRING); 
      const database = client.database(process.env.COSMOS_DB_NAME);
      const container = database.container(process.env.COSMOS_DB_COLLECTION2_NAME);

      let querySpec: SqlQuerySpec = {
        query: "SELECT f.id, f.iduser, f.statutCmd, ARRAY(SELECT * FROM c IN f.produits WHERE c.EAN = 
        @EAN) AS produits , f._rid, f._self ,f._etag, f._attachments, f._ts FROM Commandes f WHERE f.id = 
        @id",
          parameters: [ {name: "@id" , value : id}, {name: "@EAN" , value : EAN}]
         }; 
      
        const {resources : items}  = await container.items.query(querySpec).fetchAll();
 
        items[0].produits[0].statutProduit = newStatut;
        const {resource : updatedItem}  = await 
        container.item(items[0].id).replace(items[0].produits[0]);
    
      context.res = {
        status: 200, /* Defaults to 200 */
        body : updatedItem
        
      };
    

  } catch (err) {
      console.log(err);
      context.res = {
        status: 401,
        body: "la fonction est exécuté avec succée, mais pas de Update effectuée"
       };
  }
};
  

ниже http-запроса и тела содержимого..

http://localhost:7071/api/UpdateStatutProduit /{идентификатор}/{EAN} введите описание изображения здесь

Мне нужно обновить значение в ‘statutProduit’ с 0 до 2, когда его ‘EAN’ (8002470085353) передается в параметре?

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

Ответ №1:

В Cosmos DB в настоящее время нет способа частично обновить элемент, а на самом деле нет понятия «вложенный документ». Скорее всего, вы бы изменили любое из значений во всем элементе и выполнили операцию замены на обновленный элемент.

В вашем случае produits значение представляет собой просто массив объектов внутри элемента, поэтому вы можете изменить любое из этих значений и отправить весь элемент, чтобы заменить текущий в Cosmos DB. Если обновления необходимы для нескольких элементов, вы можете использовать foreach цикл по результатам запроса и обрабатывать каждое обновление по одному за раз.

Комментарии:

1. Привет @Noah, спасибо за ответ, это полезно, я постараюсь это сделать

Ответ №2:

Это возможно, поскольку API исправления выпущен в cosmos:

 const updateObj: PatchRequestBody = [
        {
            op: 'replace',
            path: '/updatedBy',
            value: "Username",
        },
        {
            op: 'replace',
            path: '/year',
            value: 2021,
        }
    ];
    
    dbContainer.item(id, partitionKey).patch(updateObj);
  

Ссылка: https://learn.microsoft.com/en-us/azure/cosmos-db/partial-document-update-getting-started