Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Funkce částečné aktualizace dokumentů azure Cosmos DB, označovaná také jako rozhraní PATCH API, poskytuje pohodlný způsob, jak upravit dokument v kontejneru. Pokud chcete aktualizovat dokument, musí si ho klient přečíst, provést kontroly optimistického řízení souběžnosti (v případě potřeby), aktualizovat dokument místně a pak ho odeslat přes drát jako celé volání rozhraní API Nahradit dokument.
Tato funkce částečné aktualizace dokumentu výrazně zlepšuje toto prostředí. Klient může v dokumentu odesílat pouze změněné vlastnosti nebo pole, aniž by museli provádět úplnou operaci nahrazení dokumentu. Mezi klíčové výhody této funkce patří:
- Vylepšená produktivita vývojářů: Poskytuje pohodlné rozhraní API pro snadné použití a možnost podmíněné aktualizace dokumentu.
- Vylepšení výkonu: Vyhýbá se nadbytečným cyklům CPU na straně klienta, což snižuje latenci end-to-end a spotřebu síťové šířky pásma.
- Zápisy do více oblastí: Podporuje automatické a transparentní řešení konfliktů s částečnými aktualizacemi na oddělených cestách v rámci stejného dokumentu.
Note
Operace částečné aktualizace dokumentu je založena na JSON Patch RFC. Názvy vlastností v cestách musí escapovat znaky ~ a / jako ~0 a ~1, v tomto pořadí.
Příklad cílového dokumentu JSON:
{
"id": "eeeeeeee-4444-5555-6666-ffffffffffff",
"name": "R-410 Road Bicycle",
"price": 455.95,
"inventory": {
"quantity": 15
},
"used": false,
"categoryId": "road-bikes",
"tags": ["r-series"]
}
Dokument opravy JSON:
[
{ "op": "add", "path": "/color", "value": "silver" },
{ "op": "remove", "path": "/used" },
{ "op": "set", "path": "/price", "value": 355.45 },
{ "op": "incr", "path": "/inventory/quantity", "value": 10 },
{ "op": "add", "path": "/tags/-", "value": "featured-bikes" },
{ "op": "move", "from": "/color", "path": "/inventory/color" }
]
Výsledný dokument JSON:
{
"id": "eeeeeeee-4444-5555-6666-ffffffffffff",
"name": "R-410 Road Bicycle",
"price": 355.45,
"inventory": {
"quantity": 25,
"color": "silver"
},
"categoryId": "road-bikes",
"tags": ["r-series", "featured-bikes"]
}
Podporované operace
Tato tabulka shrnuje operace podporované touto funkcí.
Note
cílová cesta odkazuje na umístění v dokumentu JSON.
| Typ operace | Description |
|---|---|
| Přidat |
Add provede jednu z následujících operací v závislosti na cílové cestě: • Pokud cílová cesta určuje prvek, který neexistuje, přidá se. • Pokud cílová cesta určuje prvek, který již existuje, jeho hodnota se nahradí. • Pokud je cílová cesta platným indexem pole, vloží se do pole v zadaném indexu nový prvek. Tím se stávající prvky posunou za nový prvek. • Pokud je zadaný index roven délce pole, připojí prvek k matici. Místo zadávání indexu - můžete také použít znak. Výsledkem je také připojení elementu k poli.Poznámka: Zadání indexu většího než délka pole způsobí chybu. |
| Set |
Set je podobný jako Add kromě datového typu pole. Pokud je cílová cesta platným indexem pole, aktualizuje se existující prvek v tomto indexu. |
| Nahradit |
Replace je podobný Set, kromě toho, že se řídí důslednou sémantikou pouze nahrazení. V případě, že cílová cesta určuje prvek nebo pole, které neexistuje, dojde k chybě. |
| Remove |
Remove provede jednu z následujících operací v závislosti na cílové cestě: • Pokud cílová cesta určuje prvek, který neexistuje, dojde k chybě. • Pokud cílová cesta určuje prvek, který již existuje, je odebrán. • Pokud je cílová cesta indexem pole, odstraní se a všechny prvky nad zadaným indexem se posunou o jednu pozici zpět. Poznámka: Zadání indexu, který je roven nebo větší než délka pole, by vedlo k chybě. |
| Increment | Tento operátor zvýší pole o zadanou hodnotu. Může přijímat kladné i záporné hodnoty. Pokud pole neexistuje, vytvoří pole a nastaví ho na zadanou hodnotu. |
| Move | Tento operátor odebere hodnotu v zadaném umístění a přidá ji do cílového umístění. Objekt operace MUSÍ obsahovat člena "from", což je řetězec s hodnotou ukazatele JSON, který odkazuje na umístění v cílovém dokumentu, odkud se hodnota přemístí. Aby byla operace úspěšná, musí existovat umístění „from“. Pokud umístění "cesta" navrhne objekt, který neexistuje, vytvoří objekt a nastaví hodnotu rovnu hodnotě v umístění "from". •Pokud umístění "path" navrhne objekt, který již existuje, nahradí hodnotu v umístění "path" hodnotou v umístění "from". •Atribut "path" nemůže být podřízeným prvkem JSON objektu JSON "from". |
Podporované režimy
Funkce částečné aktualizace dokumentu podporuje následující režimy provozu. Příklady kódu najdete v dokumentu Začínáme .
Oprava dokumentu: Jeden dokument můžete opravit podle jeho ID a klíče oddílu. V jednom dokumentu je možné provést několik operací oprav. Maximální limit je 10 operací.
Oprava více dokumentů: Více dokumentů ve stejném klíči oddílu lze opravit jako součást transakce. Tato transakce s více dokumenty je potvrzena pouze v případě, že všechny operace budou úspěšné v pořadí, v jakém jsou popsány. Pokud jakákoli operace selže, vrátí se celá transakce zpět.
Podmíněná aktualizace: U dříve zmíněných režimů je také možné přidat predikát filtru podobné SQL (například
from c where c.taskNum = 3), aby operace selhala, pokud předběžná podmínka zadaná v predikátu není splněná.Můžete také použít hromadná rozhraní API podporovaných sad SDK ke spuštění jedné nebo více operací oprav na více dokumentech.
Podobnosti a rozdíly
Pojďme porovnat podobnosti a rozdíly mezi podporovanými režimy.
Přidat vs. Nastavit
Operace Set je podobná Add pro všechny datové typy s výjimkou Array. Operace Add v libovolném (platném) indexu způsobí přidání elementu v zadaném indexu a všechny existující prvky v poli se nakonec posunou za existující prvek. Toto chování je na rozdíl od Set operace, která aktualizuje existující prvek v zadaném indexu.
Přidání vs. Nahrazení
Operace Add přidá vlastnost, pokud ještě neexistuje (včetně Array datového typu).
Replace operace selže, pokud vlastnost neexistuje (platí i pro Array datový typ).
Nastavení vs. nahrazení
Operace Set přidá vlastnost, pokud ještě neexistuje (s výjimkou případu, kdy existuje Array).
Replace operace selže, pokud vlastnost neexistuje (platí i pro Array datový typ).
Note
Replace je vhodným kandidátem, kde uživatel očekává, že některé vlastnosti budou vždy přítomné a umožní vám to uplatnit nebo vynutit.
Referenční informace k rozhraní REST API pro částečnou aktualizaci dokumentu
Rozhraní REST API služby Azure Cosmos DB poskytuje programový přístup k prostředkům služby Azure Cosmos DB pro vytváření, dotazování a odstraňování databází, kolekcí dokumentů a dokumentů. Kromě provádění operací vložení, nahrazení, odstranění, čtení, výčtu a dotazování na dokumenty JSON v kolekci můžete použít metodu PATCH HTTP pro částečnou operaci aktualizace dokumentu. Podrobnosti najdete v referenčních informacích k rozhraní REST API služby Azure Cosmos DB.
Zde je příklad, jak vypadá požadavek pro operaci set využívající částečnou aktualizaci dokumentu.
PATCH https://querydemo.documents.azure.com/dbs/FamilyDatabase/colls/FamilyContainer/docs/Andersen.1 HTTP/1.1
x-ms-documentdb-partitionkey: ["Andersen"]
x-ms-date: Tue, 29 Mar 2016 02:28:29 GMT
Authorization: type%3dmaster%26ver%3d1.0%26sig%3d92WMAkQv0Zu35zpKZD%2bcGSH%2b2SXd8HGxHIvJgxhO6%2fs%3d
Content-Type:application/json_patch+json
Cache-Control: no-cache
User-Agent: Microsoft.Azure.DocumentDB/2.16.12
x-ms-version: 2015-12-16
Accept: application/json
Host: querydemo.documents.azure.com
Cookie: x-ms-session-token#0=602; x-ms-session-token=602
Content-Length: calculated when request is sent
Connection: keep-alive
{
"operations": [
{
"op": "set",
"path": "/Parents/0/FamilyName",
"value": "Bob"
}
]
}
Řešení konfliktů na úrovni dokumentu versus na úrovni cesty
Pokud je váš účet služby Azure Cosmos DB nakonfigurovaný s několika oblastmi zápisu, konflikty a zásady řešení konfliktů se uplatňují na úrovni dokumentu, přičemž výchozí zásadou řešení konfliktů je zásada "Poslední zápis vítězí" (LWW). V případě částečných aktualizací dokumentů operace oprav na více oblastech rozpoznají a vyřeší konflikty na podrobnější úrovni cest.
Řešení konfliktů je možné lépe pochopit pomocí příkladu.
Předpokládejme, že máte v Azure Cosmos DB následující dokument:
{
"id": 1,
"name": "John Doe",
"email": "jdoe@contoso.com",
"phone": ["12345", "67890"],
"level": "gold"
}
Různí klienti vydávají operace oprav souběžně napříč různými oblastmi:
-
Setpřiřadit/levelk platině -
Remove67890 z/phone
Vzhledem k tomu, že požadavky na aktualizace byly provedeny na nekonfliktní cesty v dokumentu, tyto žádosti se automaticky a transparentně vyřeší (na rozdíl od situace, kdy by rozhodoval poslední zápis na úrovni dokumentu).
Po vyřešení konfliktů se zobrazí následující dokument:
{
"id": 1,
"name": "John Doe",
"email": "jdoe@contoso.com",
"phone": ["12345"],
"level": "platinum"
}
Note
V případě, že se stejná vlastnost dokumentu současně opravuje napříč několika oblastmi, platí běžné zásady řešení konfliktů.
Změna kanálu
Kanál příchozích změn ve službě Azure Cosmos DB monitoruje kontejner pro jakékoli změny a následně zobrazí dokumenty, které byly změněny. Pomocí kanálu změn uvidíte všechny aktualizace dokumentů, včetně částečných i úplných aktualizací dokumentů. Při zpracování položek z kanálu změn se celý dokument vrátí i v případě, že aktualizace byla výsledkem operace opravy.
Další informace o kanálu změn ve službě Azure Cosmos DB najdete v tématu Kanál změn ve službě Azure Cosmos DB.