#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