Szybki start: tworzenie interfejsu API dla aplikacji tabel przy użyciu zestawu Java SDK i usługi Azure Cosmos DB
DOTYCZY: Tabeli
W tym przewodniku Szybki start pokazano, jak uzyskać dostęp do interfejsu API tabel usługi Azure Cosmos DB z poziomu aplikacji Java. Interfejs API tabel usługi Azure Cosmos DB to bez schematu magazyn danych, który umożliwia aplikacjom przechowywanie ustrukturyzowanych danych NoSQL w chmurze. Ponieważ dane są przechowywane w projekcie bez schematu, nowe właściwości (kolumny) są automatycznie dodawane do tabeli po dodaniu obiektu z nowym atrybutem do tabeli.
Aplikacje Java mogą uzyskiwać dostęp do interfejsu API tabel usługi Azure Cosmos DB przy użyciu biblioteki klienta azure-data-tables .
Wymagania wstępne
Przykładowa aplikacja jest napisana w środowisku Spring Boot 2.6.4. Można użyć środowiska Visual Studio Code lub Środowiska IntelliJ IDEA jako środowiska IDE.
Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto .
Przykładowa aplikacja
Przykładowa aplikacja dla tego samouczka może zostać sklonowana lub pobrana z repozytorium https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java. Zarówno aplikacja startowa, jak i ukończona są uwzględnione w przykładowym repozytorium.
git clone https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java
Przykładowa aplikacja używa danych pogodowych jako przykładu, aby zademonstrować możliwości interfejsu API tabel. Obiekty reprezentujące obserwacje pogody są przechowywane i pobierane przy użyciu interfejsu API dla tabeli, w tym przechowywania obiektów z dodatkowymi właściwościami w celu zademonstrowania możliwości bez schematu interfejsu API tabel.
1 — Tworzenie konta usługi Azure Cosmos DB
Najpierw należy utworzyć konto interfejsu API tabel usługi Azure Cosmos DB, które będzie zawierać tabele używane w aplikacji. Można to zrobić przy użyciu Azure Portal, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell.
Zaloguj się do Azure Portal i wykonaj następujące kroki, aby utworzyć konto usługi Azure Cosmos DB.
2 — Tworzenie tabeli
Następnie należy utworzyć tabelę na koncie usługi Azure Cosmos DB, aby aplikacja mogła być używana. W przeciwieństwie do tradycyjnej bazy danych wystarczy określić nazwę tabeli, a nie właściwości (kolumny) w tabeli. W miarę ładowania danych do tabeli właściwości (kolumny) zostaną automatycznie utworzone zgodnie z potrzebami.
W Azure Portal wykonaj następujące kroki, aby utworzyć tabelę na koncie usługi Azure Cosmos DB.
3 — Pobieranie parametrów połączenia usługi Azure Cosmos DB
Aby uzyskać dostęp do tabel w usłudze Azure Cosmos DB, aplikacja będzie potrzebować parametrów połączenia tabeli dla konta usługi CosmosDB Storage. Parametry połączenia można pobrać przy użyciu Azure Portal, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell.
Parametry połączenia dla konta usługi Azure Cosmos DB są uważane za wpis tajny aplikacji i muszą być chronione jak każdy inny wpis tajny aplikacji lub hasło. W tym przykładzie użyto funkcji POM do przechowywania parametrów połączenia podczas programowania i udostępnienia jej aplikacji.
<profiles>
<profile>
<id>local</id>
<properties>
<azure.tables.connection.string>
<![CDATA[YOUR-DATA-TABLES-SERVICE-CONNECTION-STRING]]>
</azure.tables.connection.string>
<azure.tables.tableName>WeatherData</azure.tables.tableName>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
4 — Dołączanie pakietu azure-data-tables
Aby uzyskać dostęp do interfejsu API tabel usługi Azure Cosmos DB z poziomu aplikacji Java, dołącz pakiet azure-data-tables .
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-data-tables</artifactId>
<version>12.2.1</version>
</dependency>
5 — Konfigurowanie klienta tabeli w tabeli TableServiceConfig.java
Zestaw Azure SDK komunikuje się z platformą Azure przy użyciu obiektów klienta w celu wykonywania różnych operacji na platformie Azure. Obiekt TableClient jest obiektem używanym do komunikowania się z interfejsem API tabel usługi Azure Cosmos DB.
Aplikacja zazwyczaj tworzy pojedynczy obiekt TableClient na tabelę do użycia w całej aplikacji. Zaleca się wskazanie, że metoda tworzy fasolę obiektu TableClient , która ma być zarządzana przez kontener Spring i jako jedenton, aby to osiągnąć.
TableServiceConfig.java
W pliku aplikacji zmodyfikuj metodę tableClientConfiguration()
tak, aby odpowiadała następującemu fragmentowi kodu:
@Configuration
public class TableServiceConfiguration {
private static String TABLE_NAME;
private static String CONNECTION_STRING;
@Value("${azure.tables.connection.string}")
public void setConnectionStringStatic(String connectionString) {
TableServiceConfiguration.CONNECTION_STRING = connectionString;
}
@Value("${azure.tables.tableName}")
public void setTableNameStatic(String tableName) {
TableServiceConfiguration.TABLE_NAME = tableName;
}
@Bean
public TableClient tableClientConfiguration() {
return new TableClientBuilder()
.connectionString(CONNECTION_STRING)
.tableName(TABLE_NAME)
.buildClient();
}
}
Należy również dodać następującą instrukcję using w górnej części TableServiceConfig.java
pliku.
import com.azure.data.tables.TableClient;
import com.azure.data.tables.TableClientBuilder;
6 — Implementowanie operacji tabeli usługi Azure Cosmos DB
Wszystkie operacje tabeli usługi Azure Cosmos DB dla przykładowej aplikacji są implementowane w klasie znajdującej TablesServiceImpl
się w katalogu Services . Musisz zaimportować com.azure.data.tables
pakiet zestawu SDK.
import com.azure.data.tables.TableClient;
import com.azure.data.tables.models.ListEntitiesOptions;
import com.azure.data.tables.models.TableEntity;
import com.azure.data.tables.models.TableTransactionAction;
import com.azure.data.tables.models.TableTransactionActionType;
Na początku TableServiceImpl
klasy dodaj zmienną składową dla obiektu TableClient i konstruktora, aby umożliwić wstrzyknięcie obiektu TableClient do klasy.
@Autowired
private TableClient tableClient;
Pobieranie wierszy z tabeli
Klasa TableClient zawiera metodę o nazwie listEntities , która umożliwia wybieranie wierszy z tabeli. W tym przykładzie, ponieważ żadne parametry nie są przekazywane do metody, wszystkie wiersze zostaną wybrane z tabeli.
Metoda przyjmuje również ogólny parametr typu TableEntity , który określa dane klasy modelu zostaną zwrócone jako. W takim przypadku jest używana wbudowana klasa TableEntity , co oznacza, że listEntities
metoda zwróci PagedIterable<TableEntity>
kolekcję jako wyniki.
public List<WeatherDataModel> retrieveAllEntities() {
List<WeatherDataModel> modelList = tableClient.listEntities().stream()
.map(WeatherDataUtils::mapTableEntityToWeatherDataModel)
.collect(Collectors.toList());
return Collections.unmodifiableList(WeatherDataUtils.filledValue(modelList));
}
Klasa TableEntity zdefiniowana w com.azure.data.tables.models
pakiecie ma właściwości dla wartości klucza partycji i klucza wiersza w tabeli. Te dwie wartości dla unikatowego klucza dla wiersza w tabeli. W tej przykładowej aplikacji nazwa stacji pogodowej (miasta) jest przechowywana w kluczu partycji, a data/godzina obserwacji jest przechowywana w kluczu wiersza. Wszystkie inne właściwości (temperatura, wilgotność, prędkość wiatru) są przechowywane w słowniku TableEntity
w obiekcie.
Często praktyką jest mapowania obiektu TableEntity na obiekt własnej definicji. Przykładowa aplikacja definiuje klasę WeatherDataModel
w katalogu Models w tym celu. Ta klasa ma właściwości nazwy stacji i daty obserwacji, do której będzie mapować klucz partycji i klucz wiersza, zapewniając bardziej znaczące nazwy właściwości dla tych wartości. Następnie używa słownika do przechowywania wszystkich pozostałych właściwości obiektu. Jest to typowy wzorzec podczas pracy z usługą Table Storage, ponieważ wiersz może mieć dowolną liczbę dowolnych właściwości i chcemy, aby nasze obiekty modelu mogły przechwytywać wszystkie z nich. Ta klasa zawiera również metody wyświetlania listy właściwości w klasie.
public class WeatherDataModel {
public WeatherDataModel(String stationName, String observationDate, OffsetDateTime timestamp, String etag) {
this.stationName = stationName;
this.observationDate = observationDate;
this.timestamp = timestamp;
this.etag = etag;
}
private String stationName;
private String observationDate;
private OffsetDateTime timestamp;
private String etag;
private Map<String, Object> propertyMap = new HashMap<String, Object>();
public String getStationName() {
return stationName;
}
public void setStationName(String stationName) {
this.stationName = stationName;
}
public String getObservationDate() {
return observationDate;
}
public void setObservationDate(String observationDate) {
this.observationDate = observationDate;
}
public OffsetDateTime getTimestamp() {
return timestamp;
}
public void setTimestamp(OffsetDateTime timestamp) {
this.timestamp = timestamp;
}
public String getEtag() {
return etag;
}
public void setEtag(String etag) {
this.etag = etag;
}
public Map<String, Object> getPropertyMap() {
return propertyMap;
}
public void setPropertyMap(Map<String, Object> propertyMap) {
this.propertyMap = propertyMap;
}
}
Metoda mapTableEntityToWeatherDataModel
służy do mapowania obiektu TableEntity na WeatherDataModel
obiekt. Metoda mapTableEntityToWeatherDataModel
mapuje PartitionKey
bezpośrednio właściwości , , Timestamp
RowKey
, i Etag
, a następnie używa properties.keySet
metody do iteracji innych właściwości w TableEntity
obiekcie i mapowania ich na WeatherDataModel
obiekt, minus właściwości, które zostały już zamapowane bezpośrednio.
Edytuj kod w metodzie mapTableEntityToWeatherDataModel
, aby był zgodny z następującym blokiem kodu.
public static WeatherDataModel mapTableEntityToWeatherDataModel(TableEntity entity) {
WeatherDataModel observation = new WeatherDataModel(
entity.getPartitionKey(), entity.getRowKey(),
entity.getTimestamp(), entity.getETag());
rearrangeEntityProperties(observation.getPropertyMap(), entity.getProperties());
return observation;
}
private static void rearrangeEntityProperties(Map<String, Object> target, Map<String, Object> source) {
Constants.DEFAULT_LIST_OF_KEYS.forEach(key -> {
if (source.containsKey(key)) {
target.put(key, source.get(key));
}
});
source.keySet().forEach(key -> {
if (Constants.DEFAULT_LIST_OF_KEYS.parallelStream().noneMatch(defaultKey -> defaultKey.equals(key))
&& Constants.EXCLUDE_TABLE_ENTITY_KEYS.parallelStream().noneMatch(defaultKey -> defaultKey.equals(key))) {
target.put(key, source.get(key));
}
});
}
Filtrowanie wierszy zwracanych z tabeli
Aby filtrować wiersze zwrócone z tabeli, możesz przekazać ciąg filtru stylu OData do metody listEntities . Jeśli na przykład chcesz uzyskać wszystkie odczyty pogodowe dla Chicago między północą 1 lipca 2021 r. a północą 2 lipca 2021 r. (włącznie), przekaż następujący ciąg filtru.
PartitionKey eq 'Chicago' and RowKey ge '2021-07-01 12:00 AM' and RowKey le '2021-07-02 12:00 AM'
Wszystkie operatory filtrów OData można wyświetlić w witrynie internetowej OData w sekcji Filtruj opcję zapytania systemowego
W przykładowej aplikacji FilterResultsInputModel
obiekt jest przeznaczony do przechwytywania wszystkich kryteriów filtrowania dostarczonych przez użytkownika.
public class FilterResultsInputModel implements Serializable {
private String partitionKey;
private String rowKeyDateStart;
private String rowKeyTimeStart;
private String rowKeyDateEnd;
private String rowKeyTimeEnd;
private Double minTemperature;
private Double maxTemperature;
private Double minPrecipitation;
private Double maxPrecipitation;
public String getPartitionKey() {
return partitionKey;
}
public void setPartitionKey(String partitionKey) {
this.partitionKey = partitionKey;
}
public String getRowKeyDateStart() {
return rowKeyDateStart;
}
public void setRowKeyDateStart(String rowKeyDateStart) {
this.rowKeyDateStart = rowKeyDateStart;
}
public String getRowKeyTimeStart() {
return rowKeyTimeStart;
}
public void setRowKeyTimeStart(String rowKeyTimeStart) {
this.rowKeyTimeStart = rowKeyTimeStart;
}
public String getRowKeyDateEnd() {
return rowKeyDateEnd;
}
public void setRowKeyDateEnd(String rowKeyDateEnd) {
this.rowKeyDateEnd = rowKeyDateEnd;
}
public String getRowKeyTimeEnd() {
return rowKeyTimeEnd;
}
public void setRowKeyTimeEnd(String rowKeyTimeEnd) {
this.rowKeyTimeEnd = rowKeyTimeEnd;
}
public Double getMinTemperature() {
return minTemperature;
}
public void setMinTemperature(Double minTemperature) {
this.minTemperature = minTemperature;
}
public Double getMaxTemperature() {
return maxTemperature;
}
public void setMaxTemperature(Double maxTemperature) {
this.maxTemperature = maxTemperature;
}
public Double getMinPrecipitation() {
return minPrecipitation;
}
public void setMinPrecipitation(Double minPrecipitation) {
this.minPrecipitation = minPrecipitation;
}
public Double getMaxPrecipitation() {
return maxPrecipitation;
}
public void setMaxPrecipitation(Double maxPrecipitation) {
this.maxPrecipitation = maxPrecipitation;
}
}
Po przekazaniu TableServiceImpl
tego obiektu do retrieveEntitiesByFilter
metody w klasie tworzy ciąg filtru dla każdej wartości właściwości innej niż null. Następnie tworzy połączony ciąg filtru, łącząc wszystkie wartości z klauzulą "and". Ten połączony ciąg filtru jest przekazywany do metody listEntities w obiekcie TableClient i zwracane będą tylko wiersze pasujące do ciągu filtru. Możesz użyć podobnej metody w kodzie, aby utworzyć odpowiednie ciągi filtru zgodnie z wymaganiami aplikacji.
public List<WeatherDataModel> retrieveEntitiesByFilter(FilterResultsInputModel model) {
List<String> filters = new ArrayList<>();
if (!StringUtils.isEmptyOrWhitespace(model.getPartitionKey())) {
filters.add(String.format("PartitionKey eq '%s'", model.getPartitionKey()));
}
if (!StringUtils.isEmptyOrWhitespace(model.getRowKeyDateStart())
&& !StringUtils.isEmptyOrWhitespace(model.getRowKeyTimeStart())) {
filters.add(String.format("RowKey ge '%s %s'", model.getRowKeyDateStart(), model.getRowKeyTimeStart()));
}
if (!StringUtils.isEmptyOrWhitespace(model.getRowKeyDateEnd())
&& !StringUtils.isEmptyOrWhitespace(model.getRowKeyTimeEnd())) {
filters.add(String.format("RowKey le '%s %s'", model.getRowKeyDateEnd(), model.getRowKeyTimeEnd()));
}
if (model.getMinTemperature() != null) {
filters.add(String.format("Temperature ge %f", model.getMinTemperature()));
}
if (model.getMaxTemperature() != null) {
filters.add(String.format("Temperature le %f", model.getMaxTemperature()));
}
if (model.getMinPrecipitation() != null) {
filters.add(String.format("Precipitation ge %f", model.getMinPrecipitation()));
}
if (model.getMaxPrecipitation() != null) {
filters.add(String.format("Precipitation le %f", model.getMaxPrecipitation()));
}
List<WeatherDataModel> modelList = tableClient.listEntities(new ListEntitiesOptions()
.setFilter(String.join(" and ", filters)), null, null).stream()
.map(WeatherDataUtils::mapTableEntityToWeatherDataModel)
.collect(Collectors.toList());
return Collections.unmodifiableList(WeatherDataUtils.filledValue(modelList));
}
Wstawianie danych przy użyciu obiektu TableEntity
Najprostszym sposobem dodawania danych do tabeli jest użycie obiektu TableEntity . W tym przykładzie dane są mapowane z obiektu modelu wejściowego na obiekt TableEntity . Właściwości obiektu wejściowego reprezentującego nazwę stacji pogodowej i datę/godzinę obserwacji są mapowane odpowiednio na PartitionKey
właściwości i RowKey
), które razem tworzą unikatowy klucz dla wiersza w tabeli. Następnie dodatkowe właściwości obiektu modelu wejściowego są mapowane na właściwości słownika w obiekcie TableClient . Na koniec metoda createEntity obiektu TableClient służy do wstawiania danych do tabeli.
Zmodyfikuj klasę insertEntity
w przykładowej aplikacji, aby zawierała następujący kod.
public void insertEntity(WeatherInputModel model) {
tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}
Dane upsert używające obiektu TableEntity
Jeśli spróbujesz wstawić wiersz do tabeli z kombinacją klucza partycji/klucza wiersza, która już istnieje w tej tabeli, zostanie wyświetlony błąd. Z tego powodu często zaleca się użycie metody upsertEntity zamiast insertEntity
metody podczas dodawania wierszy do tabeli. Jeśli dana kombinacja klucza partycji/klucza wiersza już istnieje w tabeli, metoda upsertEntity zaktualizuje istniejący wiersz. W przeciwnym razie wiersz zostanie dodany do tabeli.
public void upsertEntity(WeatherInputModel model) {
tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}
Wstawianie lub upsert danych z właściwościami zmiennych
Jedną z zalet korzystania z interfejsu API tabel usługi Azure Cosmos DB jest to, że jeśli obiekt ładowany do tabeli zawiera jakiekolwiek nowe właściwości, te właściwości są automatycznie dodawane do tabeli i wartości przechowywane w usłudze Azure Cosmos DB. Nie ma potrzeby uruchamiania instrukcji DDL, takich jak ALTER TABLE
dodawanie kolumn w tradycyjnej bazie danych.
Ten model zapewnia elastyczność aplikacji podczas pracy ze źródłami danych, które mogą dodawać lub modyfikować dane, które muszą być przechwytywane w czasie lub gdy różne dane wejściowe dostarczają różne dane do aplikacji. W przykładowej aplikacji możemy symulować stację pogodową, która wysyła nie tylko podstawowe dane pogodowe, ale także kilka dodatkowych wartości. Gdy obiekt z tymi nowymi właściwościami jest przechowywany w tabeli po raz pierwszy, odpowiednie właściwości (kolumny) zostaną automatycznie dodane do tabeli.
W przykładowej aplikacji klasa jest tworzona ExpandableWeatherObject
wokół słownika wewnętrznego w celu obsługi dowolnego zestawu właściwości obiektu. Ta klasa reprezentuje typowy wzorzec, gdy obiekt musi zawierać dowolny zestaw właściwości.
public class ExpandableWeatherObject {
private String stationName;
private String observationDate;
private Map<String, Object> propertyMap = new HashMap<String, Object>();
public String getStationName() {
return stationName;
}
public void setStationName(String stationName) {
this.stationName = stationName;
}
public String getObservationDate() {
return observationDate;
}
public void setObservationDate(String observationDate) {
this.observationDate = observationDate;
}
public Map<String, Object> getPropertyMap() {
return propertyMap;
}
public void setPropertyMap(Map<String, Object> propertyMap) {
this.propertyMap = propertyMap;
}
public boolean containsProperty(String key) {
return this.propertyMap.containsKey(key);
}
public Object getPropertyValue(String key) {
return containsProperty(key) ? this.propertyMap.get(key) : null;
}
public void putProperty(String key, Object value) {
this.propertyMap.put(key, value);
}
public List<String> getPropertyKeys() {
List<String> list = Collections.synchronizedList(new ArrayList<String>());
Iterator<String> iterators = this.propertyMap.keySet().iterator();
while (iterators.hasNext()) {
list.add(iterators.next());
}
return Collections.unmodifiableList(list);
}
public Integer getPropertyCount() {
return this.propertyMap.size();
}
}
Aby wstawić lub upsert taki obiekt przy użyciu interfejsu API dla tabeli, zamapuj właściwości obiektu rozszerzalnego na obiekt TableEntity i użyj metod createEntity lub upsertEntity w obiekcie TableClient odpowiednio.
public void insertExpandableEntity(ExpandableWeatherObject model) {
tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}
public void upsertExpandableEntity(ExpandableWeatherObject model) {
tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}
Aktualizowanie jednostki
Jednostki można zaktualizować, wywołując metodę updateEntity w obiekcie TableClient . Ponieważ jednostka (wiersz) przechowywana przy użyciu interfejsu API tabel może zawierać dowolny zestaw właściwości, często warto utworzyć obiekt aktualizacji na podstawie obiektu słownika podobnego do omówionego ExpandableWeatherObject
wcześniej. W takim przypadku jedyną różnicą etag
jest dodanie właściwości, która jest używana do kontroli współbieżności podczas aktualizacji.
public class UpdateWeatherObject {
private String stationName;
private String observationDate;
private String etag;
private Map<String, Object> propertyMap = new HashMap<String, Object>();
public String getStationName() {
return stationName;
}
public void setStationName(String stationName) {
this.stationName = stationName;
}
public String getObservationDate() {
return observationDate;
}
public void setObservationDate(String observationDate) {
this.observationDate = observationDate;
}
public String getEtag() {
return etag;
}
public void setEtag(String etag) {
this.etag = etag;
}
public Map<String, Object> getPropertyMap() {
return propertyMap;
}
public void setPropertyMap(Map<String, Object> propertyMap) {
this.propertyMap = propertyMap;
}
}
W przykładowej aplikacji ten obiekt jest przekazywany do updateEntity
metody w TableServiceImpl
klasie. Ta metoda najpierw ładuje istniejącą jednostkę z interfejsu API tabel przy użyciu metody getEntity w obiekcie TableClient. Następnie aktualizuje ten obiekt jednostki i używa updateEntity
metody zapisywania aktualizacji w bazie danych. Zwróć uwagę, że metoda updateEntity pobiera bieżący element Etag obiektu, aby upewnić się, że obiekt nie uległ zmianie od czasu jego początkowego załadowania. Jeśli chcesz zaktualizować jednostkę niezależnie od tego, możesz przekazać wartość etag
do updateEntity
metody .
public void updateEntity(UpdateWeatherObject model) {
TableEntity tableEntity = tableClient.getEntity(model.getStationName(), model.getObservationDate());
Map<String, Object> propertiesMap = model.getPropertyMap();
propertiesMap.keySet().forEach(key -> tableEntity.getProperties().put(key, propertiesMap.get(key)));
tableClient.updateEntity(tableEntity);
}
Usuwanie jednostki
Aby usunąć jednostkę z tabeli, wywołaj metodę deleteEntity w obiekcie TableClient z kluczem partycji i kluczem wiersza obiektu.
public void deleteEntity(WeatherInputModel model) {
tableClient.deleteEntity(model.getStationName(),
WeatherDataUtils.formatRowKey(model.getObservationDate(), model.getObservationTime()));
}
7 — Uruchamianie kodu
Uruchom przykładową aplikację, aby korzystać z interfejsu API tabel usługi Azure Cosmos DB. Przy pierwszym uruchomieniu aplikacji nie będzie żadnych danych, ponieważ tabela jest pusta. Użyj dowolnych przycisków w górnej części aplikacji, aby dodać dane do tabeli.
Wybranie przycisku Wstaw przy użyciu jednostki tabeli powoduje otwarcie okna dialogowego umożliwiającego wstawianie lub upsert nowego wiersza przy użyciu TableEntity
obiektu.
Wybranie przycisku Wstaw przy użyciu danych rozwijanych powoduje wyświetlenie okna dialogowego, które umożliwia wstawianie obiektu z właściwościami niestandardowymi, co pokazuje, jak interfejs API tabel usługi Azure Cosmos DB automatycznie dodaje właściwości (kolumny) do tabeli w razie potrzeby. Użyj przycisku Dodaj pole niestandardowe , aby dodać co najmniej jedną nową właściwości i zademonstrować tę możliwość.
Użyj przycisku Wstaw przykładowe dane , aby załadować przykładowe dane do tabeli usługi Azure Cosmos DB.
Wybierz element Filtruj wyniki w górnym menu, który ma zostać przeniesiony do strony Wyniki filtrowania. Na tej stronie wypełnij kryteria filtrowania, aby pokazać, jak można skompilować i przekazać klauzulę filtru do interfejsu API tabel usługi Azure Cosmos DB.
Czyszczenie zasobów
Po zakończeniu pracy z przykładową aplikacją należy usunąć wszystkie zasoby platformy Azure powiązane z tym artykułem z konta platformy Azure. Można to zrobić, usuwając grupę zasobów.
Grupę zasobów można usunąć przy użyciu Azure Portal, wykonując następujące czynności.
Następne kroki
W tym przewodniku Szybki start wyjaśniono sposób tworzenia konta usługi Azure Cosmos DB, tworzenia tabeli za pomocą Eksploratora danych i uruchamiania aplikacji. Teraz możesz wykonywać zapytania dotyczące danych przy użyciu interfejsu API dla tabeli.