Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Начните работу с клиентской библиотекой Apache Cassandra для Azure Cosmos DB Node.js для сохранения, управления и выполнения запросов к неструктурированным данным. Выполните действия, описанные в этом руководстве, чтобы создать новую учетную запись, установить клиентскую библиотеку Node.js, подключиться к учетной записи, выполнить типичные операции и запросить результаты выборки данных.
Справочная документация по API | Исходный код библиотеки | Пакет (npm).
Предпосылки
подписка Azure
- Если у вас нет подписки на Azure, создайте бесплатную учетную запись перед началом.
Последняя версия Azure CLI в Azure Cloud Shell.
- Если вы предпочитаете локально запускать справочные команды CLI, войдите в Azure CLI с помощью
az loginкоманды.
- Если вы предпочитаете локально запускать справочные команды CLI, войдите в Azure CLI с помощью
- Node.js 22 или более поздней версии
Настройка
Сначала настройте учетную запись и среду разработки для этого руководства. В этом разделе описан процесс создания учетной записи, получения учетных данных и подготовки среды разработки.
Создать аккаунт
Сначала создайте API для учетной записи Apache Cassandra. После создания учетной записи создайте пространство ключей и ресурсы для таблицы.
Если у вас еще нет целевой группы ресурсов, используйте
az group createкоманду для создания новой группы ресурсов в подписке.az group create \ --name "<resource-group-name>" \ --location "<location>"az cosmosdb createИспользуйте команду для создания новой учетной записи Azure Cosmos DB для Apache Cassandra с параметрами по умолчанию.az cosmosdb create \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --locations "regionName=<location>" \ --capabilities "EnableCassandra"Создайте новое пространство ключей с именем
az cosmosdb cassandra keyspace createс помощьюcosmicworks.az cosmosdb cassandra keyspace create \ --resource-group "<resource-group-name>" \ --account-name "<account-name>" \ --name "cosmicworks"Создайте новый объект JSON для представления схемы с помощью команды Bash с несколькими строками. Затем используйте
az cosmosdb cassandra table createкоманду, чтобы создать новую таблицу с именемproducts.schemaJson=$(cat <<EOF { "columns": [ { "name": "id", "type": "text" }, { "name": "name", "type": "text" }, { "name": "category", "type": "text" }, { "name": "quantity", "type": "int" }, { "name": "price", "type": "decimal" }, { "name": "clearance", "type": "boolean" } ], "partitionKeys": [ { "name": "id" } ] } EOF )az cosmosdb cassandra table create \ --resource-group "<resource-group-name>" \ --account-name "<account-name>" \ --keyspace-name "cosmicworks" \ --name "product" \ --schema "$schemaJson"
Получение учетных данных
Теперь получите пароль для клиентской библиотеки для создания подключения к недавно созданной учетной записи.
Используйте
az cosmosdb show, чтобы получить точку контакта и имя пользователя для учетной записи.az cosmosdb show \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --query "{username:name,contactPoint:documentEndpoint}"Запишите значение свойств
contactPointиusernameиз вывода предыдущих команд. Эти свойства представляют собой контактную точку и имя пользователя , которое вы используете далее в этом руководстве для подключения к учетной записи с библиотекой.Используйте
az cosmosdb keys listдля получения ключей для учетной записи.az cosmosdb keys list \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --type "keys"Запишите значение
primaryMasterKeyсвойства из выходных данных предыдущих команд. Это значение свойства — это пароль , который вы используете далее в этом руководстве для подключения к учетной записи с библиотекой.
Подготовка среды разработки
Затем настройте среду разработки с новым проектом и клиентской библиотекой. Этот шаг является последним обязательным предварительным условием, прежде чем перейти к остальной части этого руководства.
Запустите пустую папку.
Инициализация нового модуля.
npm init es6 --yesУстановите пакет
cassandra-driverс помощью менеджера пакетов Node (npm).npm install --save cassandra-driverСоздайте файл index.js .
Начните в пустом каталоге.
Инициализация нового модуля.
npm init es6 --yesУстановите пакет
typescriptс помощью менеджера пакетов Node (npm).npm install --save-dev typescriptУстановите пакет
tsxиз npm.npm install --save-dev tsxУстановите пакет
cassandra-driverиз npm.npm install --save cassandra-driverИнициализация проекта TypeScript с помощью компилятора (
tsc).npx tsc --init --target es2017 --module es2022 --moduleResolution nodenextСоздайте файл index.ts .
Объектная модель
| Описание | |
|---|---|
Client |
Представляет определенное подключение к кластеру |
Mapper |
Клиент языка запросов Cassandra (CQL), используемый для выполнения запросов |
Примеры кода
Проверка подлинности клиента
Начните с проверки подлинности клиента с помощью учетных данных, собранных ранее в этом руководстве.
Откройте файлindex.js в интегрированной среде разработки (IDE).
Импортируйте следующие типы из
cassandra-driverмодуля:cassandracassandra.Clientcassandra.mapping.Mappercassandra.auth.PlainTextAuthProvider
import cassandra from 'cassandra-driver'; const { Client } = cassandra; const { Mapper } = cassandra.mapping; const { PlainTextAuthProvider } = cassandra.auth;Создайте строковые постоянные переменные для учетных данных, собранных ранее в этом руководстве. Присвойте переменным
usernamepasswordиcontactPoint.const username = '<username>'; const password = '<password>'; const contactPoint = '<contact-point>';Создайте другую строковую переменную для региона, в котором вы создали учетную запись Azure Cosmos DB для Apache Cassandra. Присвойте этой переменной
regionимя.const region = '<azure-region>';Создайте объект
PlainTextAuthProviderс учетными данными, указанными на предыдущих шагах.let authProvider = new PlainTextAuthProvider( username, password );ClientСоздайте объект с помощью учетных данных и переменных конфигурации, созданных на предыдущих шагах.let client = new Client({ contactPoints: [`${contactPoint}:10350`], authProvider: authProvider, localDataCenter: region, sslOptions: { secureProtocol: 'TLSv1_2_method' }, });Асинхронное подключение к кластеру.
await client.connect();Создайте новый mapper, ориентированный на пространство ключей
cosmicworksи таблицуproduct. Назовите mapperProduct.const mapper = new Mapper(client, { models: { 'Product': { tables: ['product'], keyspace: 'cosmicworks' } } });Создайте экземпляр маппера с использованием функции
forModelи имени маппераProduct.const productMapper = mapper.forModel('Product');
Откройте файл index.ts в интегрированной среде разработки (IDE).
Импортируйте следующие типы из
cassandra-driverмодуля:cassandra.authcassandra.mappingcassandra.typescassandra.Clientcassandra.ClientOptionscassandra.mapping.Mappercassandra.auth.PlainTextAuthProvider
import { auth, mapping, types, Client, ClientOptions } from 'cassandra-driver'; const { Mapper } = mapping; const { PlainTextAuthProvider } = auth;Создайте строковые постоянные переменные для учетных данных, собранных ранее в этом руководстве. Присвойте переменным
usernamepasswordиcontactPoint.const username: string = '<username>'; const password: string = '<password>'; const contactPoint: string = '<contact-point>';Создайте другую строковую переменную для региона, в котором вы создали учетную запись Azure Cosmos DB для Apache Cassandra. Присвойте этой переменной
regionимя.const region: string = '<azure-region>';Создайте объект
PlainTextAuthProviderс учетными данными, указанными на предыдущих шагах.let authProvider = new PlainTextAuthProvider( username, password );Создайте анонимный объект с параметрами, обеспечивающими использование протокола TLS 1.2.
let sslOptions = { secureProtocol: 'TLSv1_2_method' };ClientOptionsСоздайте объект с помощью учетных данных и переменных конфигурации, созданных на предыдущих шагах.let clientOptions: ClientOptions = { contactPoints: [`${contactPoint}:10350`], authProvider: authProvider, localDataCenter: region, sslOptions: sslOptions };ClientСоздайте объект с помощью переменнойclientOptionsв конструкторе.let client = new Client(clientOptions);Асинхронное подключение к кластеру.
await client.connect();Создайте новый mapper, ориентированный на пространство ключей
cosmicworksи таблицуproduct. Назовите mapperProduct.const mapper = new Mapper( client, { models: { 'Product': { tables: ['product'], keyspace: 'cosmicworks' } } });Создайте экземпляр маппера с использованием функции
forModelи имени маппераProduct.const productMapper = mapper.forModel('Product');
Предупреждение
Полная проверка уровня транспорта (TLS) отключена в этом руководстве для упрощения проверки подлинности. Для рабочих развертываний полностью включите проверку.
Обновление-вставка данных
Затем переведите новые данные в таблицу. Upserting гарантирует, что данные создаются или заменяются соответствующим образом в зависимости от того, существуют ли те же данные в таблице.
Создайте новый объект в переменной с именем
product.const product = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', name: 'Yamba Surfboard', category: 'gear-surf-surfboards', quantity: 12, price: 850.00, clearance: false };Асинхронно вызовите функцию
insert, передавая переменнуюproduct, созданную на предыдущем шаге.await productMapper.insert(product);
Определите новый интерфейс
Productс полями, соответствующими таблице, созданной ранее в этом руководстве.Тип IdstringNamestringCategorystringQuantityintPricedecimalClearanceboolinterface Product { id: string; name: string; category: string; quantity: number; price: number; clearance: boolean; }Подсказка
В Node.jsможно создать этот тип в другом файле или создать его в конце существующего файла.
Создайте новый объект типа
Product. Сохраните объект в переменной с именемproduct.const product: Product = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', name: 'Yamba Surfboard', category: 'gear-surf-surfboards', quantity: 12, price: 850.00, clearance: false };Асинхронно вызовите функцию
insert, передавая переменнуюproduct, созданную на предыдущем шаге.await productMapper.insert(product);
Чтение данных
Затем считывайте данные, которые ранее были добавлены в таблицу.
Создайте анонимный объект с именем
filter. В этом объекте добавьте свойствоidс таким же значением, как и продукт, созданный ранее в этом руководстве.const filter = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' };getВызовите функцию объекта mapper, передаваемогоfilterв переменную. Сохраните результат в переменной под названиемmatchedProduct.let matchedProduct = await productMapper.get(filter);
Создайте анонимный объект с именем
filter. В этом объекте добавьте свойствоidс таким же значением, как и продукт, созданный ранее в этом руководстве.const filter = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' };getВызовите функцию объекта mapper, передаваемогоfilterв переменную. Сохраните результат в переменной с именемmatchedProductтипаProduct.let matchedProduct: Product = await productMapper.get(filter);
Запрос данных
Наконец, используйте запрос, чтобы найти все данные, соответствующие определенному фильтру в таблице.
Создайте новую строковую переменную с именем
query, содержащую CQL-запрос, который выбирает элементы с тем же полемcategory.const query = ` SELECT * FROM cosmicworks.product WHERE category = :category ALLOW FILTERING `;Создайте анонимный объект с именем
params. В этом объекте добавьте свойствоcategoryс таким же значением, как и продукт, созданный ранее в этом руководстве.const params = { category: 'gear-surf-surfboards' };Асинхронно вызвать функцию
execute, передав в качестве аргументов переменныеqueryиparams. Сохраните свойство результатаrowsв виде переменной с именемmatchedProducts.let { rows: matchedProducts } = await client.execute(query, params);Выполните итерацию результатов запроса путем вызова
foreachметода в массиве продуктов.matchedProducts.forEach(product => { // Do something here with each result });
Создайте новую строковую переменную с именем
query, содержащую CQL-запрос, который выбирает элементы с тем же полемcategory.const query: string = ` SELECT * FROM cosmicworks.product WHERE category = :category ALLOW FILTERING `;Создайте анонимный объект с именем
params. В этом объекте добавьте свойствоcategoryс таким же значением, как и продукт, созданный ранее в этом руководстве.const params = { category: 'gear-surf-surfboards' };Асинхронно вызвать функцию
execute, передав в качестве аргументов переменныеqueryиparams. Сохраните результат в переменной с именемresultтипаtypes.ResultSet.let result: types.ResultSet = await client.execute(query, params);Сохраните свойство результата
rowsв виде переменнойmatchedProductsтипаProduct[].let matchedProducts: Product[] = result.rows;Выполните итерацию результатов запроса путем вызова
foreachметода в массиве продуктов.matchedProducts.forEach((product: Product) => { // Do something here with each result });
Запустите код
Запустите созданное приложение с помощью терминала в каталоге приложения.
node index.js
npx tsx index.ts
Очистите ресурсы
Если учетная запись больше не нужна, удалите учетную запись из подписки Azure, удалив ресурс.
az cosmosdb delete \
--resource-group "<resource-group-name>" \
--name "<account-name>"