Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: MongoDB
Это руководство содержит сведения об использовании платформы Mongoose при сохранении данных в Azure Cosmos DB. В этом пошаговом руководстве используется API Azure Cosmos DB для MongoDB. Для тех из вас, кто еще не знаком с Mongoose, — это платформа объектного моделирования для MongoDB в Node.js, которая представляет собой простое решение на основе схемы для моделирования данных приложения.
Azure Cosmos DB — это многомодельная служба базы данных от Microsoft, распространяемая по всему миру. Вы можете быстро создавать и запрашивать документы, пары "ключ — значение" и базы данных графов, используя преимущества возможностей глобального распределения и горизонтального масштабирования базы данных Azure Cosmos DB.
Необходимые компоненты
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
Пробную версию Azure Cosmos DB можно использовать бесплатно, без подписки Azure и без и каких-либо обязательств. Кроме того, вы можете создать учетную запись Azure Cosmos DB категории "Бесплатный". Для этой учетной записи бесплатно предоставляются первые 1000 ЕЗ/с и 25 ГБ пространства в хранилище. Также можно использовать эмулятор Azure Cosmos DB, который доступен по URI https://localhost:8081
. Сведения о ключе для использования с эмулятором см. в этом разделе.
Node.js версии 0.10.29 или более поздней.
Создание учетной записи Azure Cosmos DB
Давайте создадим учетную запись Azure Cosmos DB. Если у вас уже есть учетная запись, которую вы собираетесь использовать, можно перейти к шагу "Настройка приложения Node.js". Если вы используете эмулятор Azure Cosmos DB, выполните действия, описанные в этой статье, чтобы настроить эмулятор и сразу перейти к настройке приложения Node.js.
В новом окне браузера войдите на портал Azure.
В меню слева выберите Создать ресурс.
На странице New (Новый) выберите Базы данных>Azure Cosmos DB.
На странице "Выбор API" выберите Azure Cosmos DB для MongoDB>Create.
API определяет тип учетной записи, которую нужно создать. Выберите Azure Cosmos DB для MongoDB, так как вы создадите коллекцию, которая работает с MongoDB в этом кратком руководстве. Дополнительные сведения см. в статье "Обзор Azure Cosmos DB для MongoDB".
На странице Создание учетной записи Azure Cosmos DB введите параметры для новой учетной записи Azure Cosmos DB.
Параметр значение Описание Подписка Название подписки Выберите подписку Azure, которую вы хотите использовать для этой учетной записи Azure Cosmos DB. Группа ресурсов Имя группы ресурсов Выберите группу ресурсов или Создать, затем введите уникальное имя для новой группы ресурсов. Имя учетной записи Укажите уникальное имя Введите уникальное имя для идентификации вашей учетной записи Azure Cosmos DB. URI вашего аккаунта mongo.cosmos.azure.com будет добавлен к вашему уникальному имени аккаунта.
Имя может содержать только строчные буквы, цифры и дефисы (-). Его длина должна быть от 3 до 44 знаков.Расположение Ближайший к пользователям регион Выберите географическое расположение для размещения учетной записи Azure Cosmos DB. Используйте ближайшее к пользователям расположение, чтобы предоставить им максимально быстрый доступ к данным. Режим емкости Подготовленная пропускная способность или Бессерверный режим Выберите Подготовленная пропускная способность, чтобы создать учетную запись в режиме подготовленной пропускной способности. Выберите Бессерверный, чтобы создать учетную запись в режиме Бессерверный.
Примечание. Только API для MongoDB версии 4.2, 4.0 и 3.6 поддерживаются бессерверными учетными записями. Если выбрать версию 3.2, учетная запись перейдет в режим использования подготовленной пропускной способности.Применение скидки на основе категории "Бесплатный" для Azure Cosmos DB Применить или не применять В категории "Бесплатный" Azure Cosmos DB для учетной записи бесплатно предоставляются первые 1000 единиц запросов в секунду и 25 ГБ свободного места. Ознакомьтесь с дополнительными сведениями о категории "Бесплатный". Версия Выбор требуемой версии сервера Azure Cosmos DB для MongoDB совместима с сервером версии 4.2, 4.0, 3.6 и 3.2. Вы можете обновить или понизить уровень учетной записи после ее создания. Примечание.
Вы можете использовать не более одной учетной записи Azure Cosmos DB категории "Бесплатный" на подписку Azure. При создании учетной записи нужно зарегистрироваться. Если параметр подачи заявки на скидку на основе категории "Бесплатный" не отображается, это означает, что в подписке уже включена другая учетная запись категории "Бесплатный".
На вкладке Глобальное распределение настройте следующие сведения. При работе с этим кратким руководством можно оставить значения по умолчанию.
Параметр значение Описание Геоизбыточность Отключить Включает или отключает глобальное распределение в вашей учетной записи, связывая ваш регион с парным регионом. В дальнейшем в учетную запись можно добавить дополнительные регионы. Операции записи с поддержкой нескольких регионов Отключить Поддержка записи в несколько регионов позволяет использовать подготовленную пропускную способность для баз данных и контейнеров по всему миру. Примечание.
Следующие параметры недоступны, если вы выбрали значение Бессерверный для параметра Режим емкости:
- Применить скидку бесплатного уровня
- Геоизбыточность
- Операции записи с поддержкой нескольких регионов
При необходимости можно настроить дополнительные сведения на следующих вкладках.
- Сеть: настройка доступа из виртуальной сети.
- Политика резервного копирования: настройте политику периодического или непрерывного резервного копирования.
- Шифрование: используйте либо ключ, управляемый службой, либо ключ, управляемый клиентом.
- Теги: теги — это пары имя — значение, которые можно назначать различным ресурсам и группам ресурсов для их категоризации и консолидированного отображения счетов.
Выберите Review + create (Просмотреть и создать).
Создание учетной записи занимает несколько минут. Дождитесь отображения поздравляем на портале! Ваша учетная запись Azure Cosmos DB для MongoDB готова .
Создание базы данных
В этом приложении мы рассмотрим два способа создания коллекций в Azure Cosmos DB.
Хранение каждой объектной модели в отдельной коллекции. Мы рекомендуем создать базу данных с выделенной пропускной способностью. Использование этой модели емкости более экономично.
Хранение всех объектных моделей в одной коллекции Azure Cosmos DB. Если вы предпочитаете хранить все модели в одной коллекции, можно просто создать новую базу данных без выбора параметра "Подготовка пропускной способности". При использовании этой модели емкости каждая коллекция будет создаваться с отдельной пропускной способностью для каждой объектной модели.
После создания базы данных ее имя нужно будет указать в переменной среды COSMOSDB_DBNAME
.
Настройка приложения Node.js
Примечание.
Если вы просто хотите ознакомиться с примером кода, а не настраивать приложение, клонируйте пример, используемый для этого руководства, и создайте приложение Mongoose на Node.js в Azure Cosmos DB.
Чтобы создать приложение Node.js в выбранной папке, выполните следующую команду в командной строке узла.
npm init
Ответьте на вопросы, чтобы приступить к работе с проектом.
Добавьте новый файл в папку и назовите его
index.js
.Установите необходимые пакеты, используя один из параметров
npm install
.- Mongoose:
npm install mongoose --save
Примечание.
Дополнительные сведения о том, какая версия mongoose совместима с версией СЕРВЕРА API для MongoDB, см. в статье о совместимости Mongoose.
Dotenv (если вы хотите загрузить секреты из env-файла):
npm install dotenv --save
Примечание.
Параметр
--save
позволяет добавить зависимость в файл package.json.
- Mongoose:
Импортируйте зависимости в файл
index.js
.var mongoose = require('mongoose'); var env = require('dotenv').config(); //Use the .env file to load the variables
Добавьте строка подключения Azure Cosmos DB и имя Azure Cosmos DB в
.env
файл. Замените заполнители {cosmos-account-name} и {dbname} собственным именем учетной записи Azure Cosmos DB и именем базы данных без символов фигурной скобки.// You can get the following connection details from the Azure portal. You can find the details on the Connection string pane of your Azure Cosmos DB account. COSMOSDB_USER = "<Azure Cosmos DB account's user name, usually the database account name>" COSMOSDB_PASSWORD = "<Azure Cosmos DB account password, this is one of the keys specified in your account>" COSMOSDB_DBNAME = "<Azure Cosmos DB database name>" COSMOSDB_HOST= "<Azure Cosmos DB Host name>" COSMOSDB_PORT=10255
Подключитесь к Azure Cosmos DB с помощью платформы Mongoose, добавив следующий код в конец файла index.js.
mongoose.connect("mongodb://"+process.env.COSMOSDB_HOST+":"+process.env.COSMOSDB_PORT+"/"+process.env.COSMOSDB_DBNAME+"?ssl=true& replicaSet=globaldb", { auth: { username: process.env.COSMOSDB_USER, password: process.env.COSMOSDB_PASSWORD }, useNewUrlParser: true, useUnifiedTopology: true, retryWrites: false }) .then(() => console.log('Connection to CosmosDB successful')) .catch((err) => console.error(err));
Примечание.
Здесь с помощью пакета npm
dotenv
загружаются переменные среды в виде process.env.{имя_переменной}.Подключившись к Azure Cosmos DB, вы можете приступить к настройке объектных моделей в Mongoose.
Рекомендации по использованию Mongoose с Azure Cosmos DB
Для каждой создаваемой вами модели Mongoose создает новую коллекцию. Для этого лучше всего использовать вариант пропускной способности на уровне базы данных, который обсуждался выше. Чтобы использовать одну коллекцию, вам потребуются дискриминаторы Mongoose. "Дискриминаторы" — это механизм наследования схемы. Он позволяет иметь несколько моделей с пересекающимися схемами поверх той же базовой коллекции MongoDB.
Вы можете хранить различные модели данных в одной и той же коллекции, а затем использовать предложения фильтра во время запроса, чтобы извлекать только необходимые данные. Давайте обсудим каждую модель более детально.
Одна коллекция на объектную модель
В этом разделе описано, как это сделать с помощью API Azure Cosmos DB для MongoDB. Мы рекомендуем использовать этот метод, поскольку он позволяет управлять затратами и емкостью. В результате количество единиц запросов в базе данных не будет зависеть от количества объектных моделей. Это операционная модель используется в Mongoose по умолчанию. Возможно, вы с ней уже знакомы.
Откройте
index.js
еще раз.Создайте определение схемы Family (семья).
const Family = mongoose.model('Family', new mongoose.Schema({ lastName: String, parents: [{ familyName: String, firstName: String, gender: String }], children: [{ familyName: String, firstName: String, gender: String, grade: Number }], pets:[{ givenName: String }], address: { country: String, state: String, city: String } }));
Создайте объект Family (семья).
const family = new Family({ lastName: "Volum", parents: [ { firstName: "Thomas" }, { firstName: "Mary Kay" } ], children: [ { firstName: "Ryan", gender: "male", grade: 8 }, { firstName: "Patrick", gender: "male", grade: 7 } ], pets: [ { givenName: "Buddy" } ], address: { country: "USA", state: "WA", city: "Seattle" } });
Наконец, сохраните объект в Azure Cosmos DB. При этом в фоновом режиме будет создана коллекция.
family.save((err, saveFamily) => { console.log(JSON.stringify(saveFamily)); });
Теперь создайте другие схему и объект. В этот раз создайте их для мест отдыха (VacationDestinations), которые могут заинтересовать семьи.
Как и в прошлом примере, создайте схему.
const VacationDestinations = mongoose.model('VacationDestinations', new mongoose.Schema({ name: String, country: String }));
Создайте и сохраните пример объекта (к этой схеме можно добавить несколько объектов).
const vacaySpot = new VacationDestinations({ name: "Honolulu", country: "USA" }); vacaySpot.save((err, saveVacay) => { console.log(JSON.stringify(saveVacay)); });
Теперь при входе на портал Azure вы увидите две коллекции, созданные в Azure Cosmos DB.
Наконец, выполните считывание данных с Azure Cosmos DB. Так как используется стандартная операционная модель Mongoose, операции чтения идентичны таким же операциям с Mongoose.
Family.find({ 'children.gender' : "male"}, function(err, foundFamily){ foundFamily.forEach(fam => console.log("Found Family: " + JSON.stringify(fam))); });
Хранение данных в одной коллекции с помощью дискриминаторов Mongoose
Чтобы оптимизировать затраты каждой коллекции, в этом методе используются дискриминаторы Mongoose. Дискриминаторы дают возможность определить отличительный ключ, который позволяет хранить, различать и фильтровать разные объектные модели.
В этом примере вы создадите базовую объектную модель, определите отличительный ключ и добавите Family и VacationDestinations в качестве расширения к базовой модели.
Настройте базовую конфигурацию и определите ключ дискриминатора.
const baseConfig = { discriminatorKey: "_type", //If you've got a lot of different data types, you could also consider setting up a secondary index here. collection: "alldata" //Name of the Common Collection };
Затем определите общую объектную модель.
const commonModel = mongoose.model('Common', new mongoose.Schema({}, baseConfig));
Теперь определите модель Family. Обратите внимание, что вместо
mongoose.model
используетсяcommonModel.discriminator
. Кроме того, к схеме Mongoose добавлена базовая конфигурация. Итак,FamilyType
— это ключ дискриминатора.const Family_common = commonModel.discriminator('FamilyType', new mongoose.Schema({ lastName: String, parents: [{ familyName: String, firstName: String, gender: String }], children: [{ familyName: String, firstName: String, gender: String, grade: Number }], pets:[{ givenName: String }], address: { country: String, state: String, city: String } }, baseConfig));
Аналогичным образом добавьте другую схему, на этот раз для VacationDestinations. В этом случае ключ дискриминатора — это
VacationDestinationsType
.const Vacation_common = commonModel.discriminator('VacationDestinationsType', new mongoose.Schema({ name: String, country: String }, baseConfig));
Наконец, создайте объекты для модели и сохраните ее.
Добавьте объекты к модели Family.
const family_common = new Family_common({ lastName: "Volum", parents: [ { firstName: "Thomas" }, { firstName: "Mary Kay" } ], children: [ { firstName: "Ryan", gender: "male", grade: 8 }, { firstName: "Patrick", gender: "male", grade: 7 } ], pets: [ { givenName: "Buddy" } ], address: { country: "USA", state: "WA", city: "Seattle" } }); family_common.save((err, saveFamily) => { console.log("Saved: " + JSON.stringify(saveFamily)); });
Затем добавьте объекты к модели VacationDestinations и сохраните ее.
const vacay_common = new Vacation_common({ name: "Honolulu", country: "USA" }); vacay_common.save((err, saveVacay) => { console.log("Saved: " + JSON.stringify(saveVacay)); });
Теперь, если вернуться на портал Azure, вы заметите, что у вас есть лишь одна коллекция
alldata
с данными Family и VacationDestinations.Кроме того, обратите внимание, что каждый объект имеет еще один атрибут с именем
__type
, который позволяет различать две разные объектные модели.Наконец, выполните считывание данных, хранящихся в Azure Cosmos DB. Mongoose позволяет фильтровать данные на основе модели. Таким образом, вам не нужно будет выполнять другие действия при считывании данных. Просто укажите свою модель (в этом случае
Family_common
), и Mongoose выполнит фильтрацию по DiscriminatorKey.Family_common.find({ 'children.gender' : "male"}, function(err, foundFamily){ foundFamily.forEach(fam => console.log("Found Family (using discriminator): " + JSON.stringify(fam))); });
Как видите, работать с дискриминаторами Mongoose очень легко. Если у вас есть приложение, использующее платформу Mongoose, это руководство поможет настроить и запустить его с помощью API Azure Cosmos DB для MongoDB без большого количества изменений.
Очистка ресурсов
После завершения работы с приложением и учетной записью Azure Cosmos DB можно удалить созданные ресурсы Azure, чтобы избежать дополнительных расходов. Удаление ресурсов:
На панели поиска портала Azure найдите и выберите Группы ресурсов.
Выберите из списка группу ресурсов, созданную для этого краткого руководства.
На странице обзора группы ресурсов выберите Удалить группу ресурсов.
В следующем окне введите имя группы ресурсов, которую требуется удалить, и щелкните Удалить.
Следующие шаги
- Узнайте, как использовать Studio 3T с API Azure Cosmos DB для MongoDB.
- Узнайте, как использовать Robo 3T с API Azure Cosmos DB для MongoDB.
- Ознакомьтесь с примерами MongoDB с API Azure Cosmos DB для MongoDB.
- Если вы планируете ресурсы для миграции в Azure Cosmos DB, Для планирования ресурсов можно использовать сведения об имеющемся кластере базы данных.
- Если вам известно только количество виртуальных ядер и серверов в существующем кластере баз данных, прочитайте об оценке единиц запроса на основе этих данных.
- Если вам известна стандартная частота запросов для текущей рабочей нагрузки базы данных, ознакомьтесь со статьей о расчете единиц запросов с помощью планировщика ресурсов Azure Cosmos DB