将 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
将以下代码添加到 index.js 末尾,以使用 Mongoose 框架连接到 Azure Cosmos DB。
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));
此处的环境变量是使用 dotenv
npm 包以 process.env.{variableName} 加载的。
连接到 Azure Cosmos DB 后,可以在 Mongoose 中立即开始设置对象模型。
将 Mongoose 与 Azure Cosmos DB 配合使用的最佳做法
对于你创建的每个模型,Mongoose 会创建新的集合。 解决此问题的最好方法是使用前面讨论的数据库级吞吐量选项。 若要使用单个集合,需要使用 Mongoose 鉴别器。 鉴别器是架构继承机制。 使用鉴别器可在同一底层 MongoDB 集合的底层创建多个具有重叠架构的模型。
可将各种数据模型存储在同一集合中,然后在查询时使用筛选子句,只提取所需的数据。 让我们来看看每个模型。
每个对象模型一个集合
本部分探讨如何使用 Azure Cosmos DB 的用于 MongoDB 的 API 实现此目的。 此方法是我们建议的方法,因为它可以控制成本和容量。 因此,数据库上的请求单位数量不取决于对象模型的数量。 这是 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));
现在,我们创建另一个架构和对象。 这一次,我们要针对家庭成员可能感兴趣的“Vacation Destinations”创建一个架构。
我们按前面所述创建方案
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 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”模型。 请注意,我们使用的是 commonModel.discriminator
而不是 mongoose.model
。 此外,我们还要将基本配置添加到 mongoose 架构。 因此,此处的 discriminatorKey 是 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”添加的。 此处的 DiscriminatorKey 是 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));
另请注意,每个对象有另一个名为 __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 框架,可以根据本教程所述方法,让该应用程序使用 Azure Cosmos DB API for MongoDB 启动并运行,无需做出过多的更改。
执行完应用和 Azure Cosmos DB 帐户的操作以后,可以删除所创建的 Azure 资源,以免产生更多费用。 若要删除资源,请执行以下操作:
在 Azure 门户的“搜索”栏中,搜索并选择“资源组” 。
从列表中选择为本快速入门创建的资源组。
在资源组“概览”页上,选择“删除资源组” 。
在下一窗口中输入要删除的资源组的名称,然后选择“删除” 。
了解如何将 Studio 3T 与 Azure Cosmos DB 的用于 MongoDB 的 API 配合使用。
了解如何将 Robo 3T 与 Azure Cosmos DB 的用于 MongoDB 的 API 配合使用。
通过 Azure Cosmos DB 的用于 MongoDB 的 API 来浏览 MongoDB 示例。
正在尝试为迁移到 Azure Cosmos DB 进行容量计划? 可以使用有关现有数据库群集的信息进行容量规划。
如果只知道现有数据库群集中的 vCore 和服务器数量,请阅读使用 vCore 或 vCPU 估算请求单位
若知道当前数据库工作负载的典型请求速率,请阅读使用 Azure Cosmos DB 容量计划工具估算请求单位