Azure Cosmos DB:使用 .NET 连接到 MongoDB 应用

Azure Cosmos DB 由 世纪互联 提供,是多个区域分布的多模型数据库服务。 可快速创建和查询文档、键/值数据库,所有这些都受益于 Azure Cosmos DB 核心的多个区域分布和水平缩放功能。

本教程演示如何使用 Azure 门户创建 Azure Cosmos DB 帐户,以及如何使用 MongoDB API 创建用于存储数据的数据库和集合。

本教程涵盖以下任务:

  • 创建 Azure Cosmos DB 帐户
  • 更新连接字符串
  • 在虚拟机上创建 MongoDB 应用

创建数据库帐户

首先在 Azure 门户中创建 Azure Cosmos DB 帐户。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

对于本教程,可以使用 Azure Cosmos DB 模拟器,其连接字符串为:

mongodb://localhost:C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==@localhost:10255/admin?ssl=true

Tip

  1. 在新窗口中,登录到 Azure 门户
  2. 在左菜单中,依次单击“创建资源”、“数据库”,然后在“Azure Cosmos DB”下单击“创建”。

    Azure 门户的屏幕截图,其中突出显示了“更多服务”和“Azure Cosmos DB”

  3. 在“新建帐户”窗格中,为 Azure Cosmos DB 帐户指定所需的配置。

    使用 Azure Cosmos DB,可以选择以下二个编程模型之一:MongoDB 和 SQL。

    在本快速入门教程中,我们会针对 MongoDB API 编程,因此,在填写表单时,请选择“MongoDB”。 但如果有来自目录应用的文档数据,请意识到 Azure Cosmos DB 可以为所有任务关键型应用程序提供高度可用的多区域分布式数据库服务平台。

    以表中的信息作为指南,填写“新建帐户”窗格。

    “新 Azure Cosmos DB”窗格的屏幕截图

    设置 建议的值 说明
    ID 唯一值 选择用于标识 Azure Cosmos DB 帐户的唯一名称。 documents.azure.cn 会追加到所提供的 ID 以创建 URI,因此,请使用唯一但可识别的 ID。 ID 只能包含小写字母、数字及“-”字符,且长度必须为 3 到 50 个字符。
    API MongoDB API 确定要创建的帐户的类型。 Azure Cosmos DB 提供了二种 API,用于满足应用程序的需求:SQL(文档数据库)、MongoDB(文档数据库),每个目前都需要单独的帐户。

    之所以选择 MongoDB 是因为,在本快速入门中将创建可使用 MongoDB 查询的文档数据库。

    详细了解 MongoDB API
    订阅 订阅 要用于 Azure Cosmos DB 帐户的 Azure 订阅。
    资源组 与 ID 相同的值 帐户的新资源组名称。 为简单起见,可以使用与 ID 相同的名称。
    位置 离用户最近的区域 要在其中托管 Azure Cosmos DB 帐户的地理位置。 选择离用户最近的位置,使其能够以最快的速度访问数据。
  4. 单击“创建” 以创建帐户。

  5. 在工具栏上,单击“通知”可监视部署过程。

    “部署已启动”通知

  6. 部署完成后,请从“所有资源”磁贴打开新帐户。

    “所有资源”磁贴中的 Azure Cosmos DB 帐户

更新连接字符串

  1. 在 Azure 门户的“Azure Cosmos DB”页中,选择用于 MongoDB 帐户的 API。
  2. 在“帐户”边栏选项卡的左侧,单击“快速启动”。
  3. 选择平台(.NET 驱动程序Node.js 驱动程序MongoDB ShellJava 驱动程序Python 驱动程序)。 如果未列出驱动程序或工具,别担心,我们持续记录了更多连接代码片段。
  4. 将代码片段复制并粘贴到 MongoDB 应用后,即已准备就绪。

设置 MongoDB 应用

可以参考在 Azure 中创建连接到虚拟机上运行的 MongoDB 的 Web 应用教程(需进行少量修改),快速设置一个连接到 MongoDB 帐户的 API 的 MongoDB 应用程序(在本地或发布到 Azure Web 应用)。

  1. 请遵循该教程,不过需要做出一项修改。 将 Dal.cs 代码替换为以下内容:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using MyTaskListApp.Models;
    using MongoDB.Driver;
    using MongoDB.Bson;
    using System.Configuration;
    using System.Security.Authentication;
    
    namespace MyTaskListApp
    {
        public class Dal : IDisposable
        {
            //private MongoServer mongoServer = null;
            private bool disposed = false;
    
            // To do: update the connection string with the DNS name
            // or IP address of your server. 
            //For example, "mongodb://testlinux.chinacloudapp.cn
            private string connectionString = "mongodb://localhost:27017";
            private string userName = "<your user name>";
            private string host = "<your host>";
            private string password = "<your password>";
    
            // This sample uses a database named "Tasks" and a 
            //collection named "TasksList".  The database and collection 
            //will be automatically created if they don't already exist.
            private string dbName = "Tasks";
            private string collectionName = "TasksList";
    
            // Default constructor.        
            public Dal()
            {
            }
    
            // Gets all Task items from the MongoDB server.        
            public List<MyTask> GetAllTasks()
            {
                try
                {
                    var collection = GetTasksCollection();
                    return collection.Find(new BsonDocument()).ToList();
                }
                catch (MongoConnectionException)
                {
                    return new List<MyTask>();
                }
            }
    
            // Creates a Task and inserts it into the collection in MongoDB.
            public void CreateTask(MyTask task)
            {
                var collection = GetTasksCollectionForEdit();
                try
                {
                    collection.InsertOne(task);
                }
                catch (MongoCommandException ex)
                {
                    string msg = ex.Message;
                }
            }
    
            private IMongoCollection<MyTask> GetTasksCollection()
            {
                MongoClientSettings settings = new MongoClientSettings();
                settings.Server = new MongoServerAddress(host, 10255);
                settings.UseSsl = true;
                settings.SslSettings = new SslSettings();
                settings.SslSettings.EnabledSslProtocols = SslProtocols.Tls12;
    
                MongoIdentity identity = new MongoInternalIdentity(dbName, userName);
                MongoIdentityEvidence evidence = new PasswordEvidence(password);
    
                settings.Credentials = new List<MongoCredential>()
                {
                    new MongoCredential("SCRAM-SHA-1", identity, evidence)
                };
    
                MongoClient client = new MongoClient(settings);
                var database = client.GetDatabase(dbName);
                var todoTaskCollection = database.GetCollection<MyTask>(collectionName);
                return todoTaskCollection;
            }
    
            private IMongoCollection<MyTask> GetTasksCollectionForEdit()
            {
                MongoClientSettings settings = new MongoClientSettings();
                settings.Server = new MongoServerAddress(host, 10255);
                settings.UseSsl = true;
                settings.SslSettings = new SslSettings();
                settings.SslSettings.EnabledSslProtocols = SslProtocols.Tls12;
    
                MongoIdentity identity = new MongoInternalIdentity(dbName, userName);
                MongoIdentityEvidence evidence = new PasswordEvidence(password);
    
                settings.Credentials = new List<MongoCredential>()
                {
                    new MongoCredential("SCRAM-SHA-1", identity, evidence)
                };
                MongoClient client = new MongoClient(settings);
                var database = client.GetDatabase(dbName);
                var todoTaskCollection = database.GetCollection<MyTask>(collectionName);
                return todoTaskCollection;
            }
    
            # region IDisposable
    
            public void Dispose()
            {
                this.Dispose(true);
                GC.SuppressFinalize(this);
            }
    
            protected virtual void Dispose(bool disposing)
            {
                if (!this.disposed)
                {
                    if (disposing)
                    {
                    }
                }
    
                this.disposed = true;
            }
    
            # endregion
        }
    }
    
  2. 从 Azure 门户的“密钥”页中,根据帐户设置在 Dal.cs 文件中修改以下变量:

    private string userName = "<your user name>";
    private string host = "<your host>";
    private string password = "<your password>";
    
  3. 应用可供使用!

清理资源

如果不打算继续使用此应用,请使用以下步骤删除本教程在 Azure 门户中创建的所有资源。

  1. 在 Azure 门户的左侧菜单中,单击“资源组”,然后单击已创建资源的名称。
  2. 在资源组页上单击“删除”,在文本框中键入要删除的资源的名称,并单击“删除”。

后续步骤

在本教程中,已完成以下内容:

  • 创建 Azure Cosmos DB 帐户
  • 更新连接字符串
  • 在虚拟机上创建 MongoDB 应用

可以继续学习下一教程,将 MongoDB 数据导入到 Azure Cosmos DB。