65.9K
CodeProject 正在变化。 阅读更多。
Home

MONGO 就像芒果一样甜

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (40投票s)

2013年6月10日

CPOL

15分钟阅读

viewsIcon

41253

downloadIcon

811

使用 Mongo Db 作为后端开发 .Net 应用程序

 

简介:  

这次我将尝试介绍一些关于 MONGO Db 的想法。
无论如何,我知道 Mongo db 对开发人员来说不是一个新事物,但是我们 .Net 开发人员并没有在我们的开发工作中广泛使用它。在 JSON 和 JavaScript 框架的时代,我们仍然在使用 SQL Server 或 Oracle,而没有真正考虑应用程序的大小。
即使我们只需要一个小型数据库,我们也会选择 SQL Server 或 Oracle。我说得对吗?好吧……我们甚至不会考虑数据库在我们的应用程序中的相关性。对于小型应用程序,我们需要小型数据库……为什么我们要选择大型数据库呢?

 在前面几行中我提到了小型数据库……小型数据库等等。您可能在想我到底是什么意思……对吧?如果我们想定义一个小型数据库,比如大小小于 2GB,与其他表没有太多关系(比如需要大量连接才能获取有意义的数据行),或者无法以关系格式(行和列格式)存储的数据,我们可以选择像 MONGO 这样的数据库。

MONGO DB 是领先的 NoSQL 数据库。

MONGO 这个名字来源于“huMONGOus”,意思是“极其巨大

在这里,我将尝试解释 Mongo Db 的安装以及如何在我们的 C# 应用程序中使用它。在编写时,我也尝试包含了我在经验中遇到的错误。因为总有一天你会遇到这些错误,到那时我不想让你再次搜索以解决这些问题。
 

关于 Mongo 的几点: 

在开始使用之前,我想再多说几点关于 MONGO 的事情。

 

  • ·          Mongo 由 10gen 开发。
  • ·         Mongo 使用 C++ 开发。  
  • ·         Mongo 是一个面向文档的数据库。  
  • ·         Mongo 以 JSON 格式存储所有数据。
  • ·         Mongo 以 JSON 格式接收数据。
  • ·         对于 Mongo,JSON 是 BSON(二进制 JSON)。
  •    Mongo 是一个无结构的数据库,也就是说,表中一行不必与其他行具有相同的模式(无模式)。

 

这就是为什么在 Mongo 中它不是“表”而是“集合” 

记住这些,将来会很有用。 
安装: 

你准备好安装和使用了吗……
实际上,它不是一个安装,它只是下载……
 

 

  • ·          下载 zip 文件 [https://mongodb.ac.cn/downloads]
  • ·         解压并将其复制到您机器中所需的位置。
  • ·         启动数据库引擎。
  • ·         测试安装并使用它。

 

就是这么简单,对吧?好的,让我们开始吧 

下载 zip 文件

 

转到网址 https://mongodb.ac.cn/downloads
然后您会看到如下屏幕。 

我使用的是 Windows 7 32 位机器,所以我下载了红色标记的那个包。

点击下载,别犹豫,只需几秒钟。

 

哇……我下载了,它是一个名为 mongodb-win32-i386-2.4.4.zip 的压缩文件。
文件夹的名称会根据您下载的版本而改变,我这里是 mongo 的 2.4.4 版本。好了,一切就绪。
解压并将其复制到您机器中所需的位置。

解压压缩文件,然后将解压后的文件复制到您的机器中所需的驱动器。 

无论如何,我打算将文件复制到我的 D 盘,因为我的 D: 盘没有太多文件
 .. 好的,那么您打算将 mongo 文件粘贴到 C: 盘还是您自己的桌面上呢……?好的,无论您粘贴到哪里都无所谓...

在下面的快照中,您可以看到我已导航到 Mongo 文件中的 bin 文件夹  并且我还可以计算 bin 内部的文件数量到十五个  那么您呢 

 完成了!就这些

我们下一步该怎么做呢……? 

启动数据库引擎  

让我们去开始使用我们的 mongo db...
打开命令提示符,然后导航到 D 盘的 bin 目录 
 



输入 mongo.exe(这是用于启动 mongo Db PowerShell 的命令)
然后查看以下响应.. 

这真是一个很棒的异常  J 笑死……
那是什么?
无法连接到服务器。为什么会出现异常,有什么想法吗……我在此期间创建了任何服务器吗……?没有对吧,那它怎么连接到服务器呢……傻机器……
J
是的,我知道,像所有其他数据库一样,我们必须在使用它之前启动数据库引擎。
我们如何启动它……?

 我们必须使用命令 mongod 启动 mongo db,从同一位置,即 mongo 的 bin 文件夹中敲入 mongod。

让我们看看发生了什么。

 

又是一个格式完美的异常 J 对吧?您注意到我上面高亮显示的内容了吗?是的,它是 mongod 命令,第二个是异常,要求我们创建名为 data 的文件夹。
在 data 里面又有一个名为 db 的文件夹。

 

所以我们必须创建这些 data\db 文件夹。
下一个问题是我们在哪里创建这些文件夹?
我们必须在安装 mongo 的机器的 C 盘中默认创建这些文件夹结构。让我们去 C 盘创建文件夹结构。
 这里又出现了一个问题,是否强制要求在 C 盘中创建 data\db 目录……?不,不完全是,您可以创建在任何您想要的地方。但唯一的要求是您必须告诉 MONGO 我们在特定位置创建了数据文件夹,即我们必须为 mongo.exe 设置 db 路径。
好的,这里我将创建在其他位置而不是 c 盘,以便更好地理解这个选项。我将使用命令提示符在 D 盘根目录中创建 db 文件夹。
 为什么呢?因为这是我们回忆旧的 dos 命令的机会... Smile | <img src= " />。
 

 下一步是将 Db 路径设置为 mongo.exe。

再次导航回 bin 文件夹,输入命令 mongod.exe --dbpath d:\data。

我收到了如下响应。
 希望一切顺利……因为我没有在控制台中看到任何 ERROR *** J

下一步,我们可以使用命令 >start mongo.exe 启动数据库
 这里我也没有 看到任何错误或警告消息……那么我们还需要提供一个命令来使其运行和启动,即 mongod 将会在控制台中得到如下响应 

希望一切顺利。
 测试 Mongo DB 安装

现在我们必须看看我们的数据库,对吧?
是的,非常正确,否则我们怎么会相信它已经启动并运行了呢。

为了测试目的,MONGO 默认有一个名为 test 的数据库。让我们去查询它。
怎么做?我们有任何管理工作室吗……?像 SQL Server 一样,不,我们必须再次依赖命令提示符来完成。
命令提示符!!!……  

是的,就是那个命令提示符……我们老旧的命令提示符……
嘿……别害怕,是的,它就是我们旧的命令提示符。
好吧,我们来看看如何使用它……


 噢,不……不要关闭上面的命令提示符,就让它保持原样……
让我们去打开一个新的,好吗。
像往常一样导航到 Bin……
我相信你们可能还记得我们在大学时代所做的旧 C 语言编程,对吧
J

然后,在命令提示符下再次发出命令 mongo 或 mongo.exe,看看发生了什么。

您将看到如下屏幕
 

 

作为下一步。我之前提到 Mongo 默认有一个名为 test 的测试数据库,尝试向其中插入一条记录。
这里下一个问题是我们将如何插入?Mongo 有 SQL 查询吗?确切地说,Mongo 只有命令来辅助操作。

基本插入命令是     

 

***********************
BASIC INSERT COMMAND
***********************
db.test.save( { KodothTestField: ‘Myname is Kodoth’ } ) 

 其中 test 是数据库,.save 是插入命令,KodothTestField 是列或字段名,My name is Kodoth 是值。
我们的数据成功插入……万岁……!
在谈论更多之前,我们先用另一个命令检查它是否已存储。

db.test.find() 

 

 是的,它在那里……
我知道您在想每个记录旁边显示的数字,对吧,叫做 ObjectId。它就像 SQL 中的 Identity 字段,我们进行自增等等,仔细看,您会发现 ObjectId 以 92 结尾,所以每个记录都不同。

 

最后我们成功安装并验证了 MONGO,对吧。让我们开派对...
那么您现在同意 MONGO 像芒果一样甜吗?

我们还有第三方工具可以探索 MONGO 数据库,叫做 MONGO VUE。使用这个工具,我们可以对 mongo 数据库执行操作,就像我们使用 SQL Server 的管理工作室一样。

你能想象我们的 SQL Server 或 Oracle 数据库在同一个表中包含完全不同的行吗?这在我们的关系数据库表中可能吗?在 mongo 中,它会发生。我将向您展示我们如何做到这一点……

首先我将向您展示数据在关系数据库中是如何呈现的。

例如,以关系方式考虑一个 Employee 表和一个 Student 表。它们的模式会完全不同,对吧?是的,没错……
 

现在让我们看看它在 Mongo DB 中会是什么样子。上面两个表在 Mongo 中合并成一个集合…… 

这就是集合在 Mongo 中存储的方式。我想现在你真的能感受到不同了吧?
所有东西都集中在一个伞下。这不是正确的方式,但我只是想向大家展示这是如何发生的,所以我将两个完全不同的表合并到一个集合中。

如果您想尝试,可以使用以下测试脚本 

***********************
TEST INSERT SCRIPTS
*********EMPLOYEE******
db.test.save( { EmployeId: "1", EmployeFirstName: "Kodoth",EmployeLastName:"Kodoth Last",EmployeAge:"14" } ) 
db.test.save( { EmployeId: "2", EmployeFirstName: "Kodoth 2",EmployeLastName:"Kodoth Last 2",EmployeAge:"14" } ) 
db.test.save( { EmployeId: "3", EmployeFirstName: "Kodoth 3",EmployeLastName:"Kodoth Last 3",EmployeAge:"14" } ) 
******STUDENT******
db.test.save( { StudentId: "1", StudentName: "StudentName",StudentMark:"25" } ) 
db.test.save( { StudentId: "2", StudentName: "StudentName 2",StudentMark:"26" } ) 
db.test.save( { StudentId: "3", StudentName: "StudentName 3",StudentMark:"27"} )
************************

 要操作 Mongo,您可以参考 http://docs.mongodb.org/manual/reference/method/
mongo shell 方法。

从哪里获取用于 C# 的 Mongo 驱动程序 

我们需要一个驱动程序来连接应用程序/语言到数据库。作为开发人员,我们想要的是 Mongo DB 的驱动程序,是吗?

您可以使用给定链接下载 C# 应用程序的驱动程序
https://s3.amazonaws.com/drivers.mongodb.org/dotnet/CSharpDriver-1.8.1.zip.
我们将得到一个名为 CSharpDriver-[版本].zip 的压缩文件。
让我们看看这个文件里有什么以及我们如何使用它。

我看到里面大约有 9 个文件,包括文本文件和 pdb 文件,你呢,是 9 个还是更多……? 

为了避免混淆,我列出了解压应用程序后得到的 dll。

 

  1. ·         MongoDB.Bson
  2. ·         MongoDB.Driver  

 

这两个 DLL 文件都非常小,小于 412 KB,所以不要认为它们很庞大。 

主演阵容 关系型数据库 vs Mongo
在我们深入了解 Mongo 之前,我想让您了解关系型数据库和 Mongo 中的对应关系。请看下面的比较,实际上它不是一个比较,而是我提到的一个映射。

我们的第一个 Mongo C# 应用程序
实际上,我的目的是创建一个 小型员工添加、编辑和查看应用程序。
它将有一个 

 

  • 员工添加页面, 
  • 员工编辑页面和 
  • 查看页面 
好的,这些足以让您使用 Mongo 作为您的数据库吗?J让我们打开我们的 Visual Web Developer。

 

我使用了 Visual Web Developer 2010 版本作为这个例子。
让我们开始创建一个名为 MangoMONGO 的 Web 项目。
下一步,我希望通过添加引用,将我们之前解压的两个 DLL 添加到我们的应用程序中。
 

好的,我们的 Visual Studio 已经准备好了。那么我们还需要什么呢?
 是的,存储数据的数据库。
让我们在本地 Mongo(Mango)中创建一个名为 EMPLOYE_MANAGER 的数据库
J
怎么做……?我只告诉过您进行插入和选择操作,而且我们使用的是默认提供的 test 数据库。让我们快速创建一个 Mongo DB

***********************
CREATING MONGO DB
***********************
> use EMPLOYE_MANAGER  //Creates a db with the provided name
switched to db EMPLOYE_MANAGER
> db.users.save({username:"kodoth"})//Saves the created DB ,with out saving will not get created
> show dbs //Displays all the Db in the server
EMPLOYE_MANAGER 0.0625GB
local   0.03125GB
test    0.0625GB <span style="color: rgb(17, 17, 17); font-size: 14px; font-family: 'Segoe UI', sans-serif;">You can
see below how it looked when I typed “show dbs” after creating our Employe_Manager
DB.<o:p /></span><span style="color: rgb(17, 17, 17); font-family: 'Segoe UI', Arial, sans-serif; font-size: 14px;"> </span>

您可以在下面看到,在我创建了 Employe_Manager 数据库后,输入“show dbs”命令时它的显示。 

 下一步是为我们的应用程序创建用户界面。 

我们的 UI 已经完成了。现在您可以开始编写代码,将数据从 UI 获取到我们的 Mango 数据库中。

 

插入姓名、部门、年龄和薪水在 SQL 中并不是什么大问题。要使用 SQL 插入,我们首先会创建一个存储过程,然后是很多其他的过程和步骤,对吧?在 mongo 中,我们所做的是为 Employee 创建一个实体类,然后将实体与 UI 中所需的数据绑定。然后插入到数据库,就是这样,完成了。让我们看看如何在实践中完成。
首先,我将像所有应用程序一样,创建一个名为 Employee 的实体类。
 
 您已经注意到 Id 的类型是 MongoDB.Bson.ObjectId ,它现在是主键。

一切就绪,那么我们下一步该做什么呢?

像所有其他应用程序一样,我们必须与我们的数据库建立连接。

我知道您可能在想 web.config、ADO.Net ConnectionStrings 啦啦啦啦啦……对吧?

别想那么多……这非常简单……我将向您展示如何用两行代码建立连接。 

这很简单,对吧?

建立连接时,您必须注意一件事,即检查 Mongo 服务器是否在您的机器上运行。
那么我们接下来该怎么做呢?

 我想我们现在必须编写保存和关闭按钮的代码。

 在保存按钮中: 

实例化 Employee 对象。
将文本框中的值分配给属性,除了 ObjectId 字段,它是一个在 Mongo 中具有自增标识符的主键字段。
 

实例化 Employee 后,使用 Mongo API 方法将 Employee 对象插入到数据库中。

我们如何进行插入?
Mongo API 是否具有此功能?

 


点击事件的代码回答了上述问题 

***********************
SAVE BUTTON CODE SNIPPET
***********************
protected void btnSave_Click(object sender, EventArgs e)
        {
            ///Establish Connection
            MongoDatabase mdb = GetConnectedToMongo();
            ///Get The Collection in which you have to insert the record
            var collection = mdb.GetCollection<Employee>("Employee");
            ///Fill the Employee Entity
            Employee objEmp = new Employee();
            objEmp.Name = txtName.Text;
            objEmp.Salary = txtSalary.Text;
            objEmp.Department = txtDepartment.Text;
            objEmp.Age = Convert.ToInt32(txtAge.Text.Trim());
            ///Finally Insert
            collection.Insert(objEmp);
            ///Get the id of inserted record in return
            var id = objEmp.Id;
            if (id.ToString() != "")
            {
                lblResponse.Visible = true;
                lblResponse.Text = lblResponse.Text + id.ToString();
            }
        }

我想我们必须尝试执行代码。
在此之前,我只想提醒您,在 Mongo 中,我们将表称为集合。
在这里,我们将把数据插入到“EMPLOYE_MANAGER”数据库中的 Employee 集合中。
在此之前,我们先通过 Shell 命令 > db.Employee.find () 确保 Employee 集合中没有数据。

是的,一切看起来都很完美;集合中没有数据或记录。

我将运行代码,在我们的 Employe_Manager 数据库中保存一条记录。
我们的代码成功执行,我们得到了 William 的 Employee Id,表示这条记录已插入数据库。您确定吗?
我想我们必须直接在数据库中检查记录是否已插入,或者他只是在撒谎。
我去了数据库命令提示符并执行了我们的 Find 命令,
那么您想看看我得到了什么结果吗……?


 万岁……!记录成功插入数据库。他说的是真的,对吧……

就是这样……Mongo 又告诉我们,它像芒果一样甜。

非常简单,您是觉得插入到数据库中,还是写入文件中呢?

不,非常不!Mongo 简单,对吧?

 

所以我们成功地执行了插入操作。

列出员工 
现在,我们必须了解如何检索记录并在我们的 UI 中显示。
我计划在另一个页面上执行此过程。由于我们使用的是 Development Express 的默认模板,所以我们有两个页面,Default.aspx 和 About.aspx。我们使用 Default 页面执行插入操作,现在我们将使用 About.aspx 页面。
我创建了另一个名为 MONGOConnect.cs 的类文件来编写数据库连接,就像 SQL 的数据库助手一样。

我将把 Employee 集合中的所有员工列在一个 ASP 网格中。

从集合中获取记录,然后用这些记录创建一个数据源,之后将其设置为该 ASP 网格的数据源,并绑定它。

***********************
BINDING TO GRID VIEW
***********************
protected void Page_Load(object sender, EventArgs e)
        {
            MONGOConnect objMC = new MONGOConnect();//Helper Class
            var collectionEmployee = objMC.GetMongoCollection("Employee");//Gets Employee Collection
            var lstEmployee = collectionEmployee.AsQueryable<Employee>().ToList<Employee>(); //Queries the Employee collection and Converts to List            
            grdListEmployee.DataSource = lstEmployee;//Set the List as Data source  
            grdListEmployee.DataBind();//Binds the Grid
        }

希望您已经从 Page_Load 代码中理解了上述步骤。

请看下面绑定的数据网格……
如此美丽,对吧?  Smile | <img src= " />

我们已完美地完成了绑定。


接下来我们将对应用程序进行编辑/更新操作。

为此,我认为我们必须使用旧的 Grid View 的编辑功能和模板列。将此视为复习 Grid View 知识的机会  Smile | <img src= " />
我在 Grid View 中添加了一列用于放置编辑按钮。
 
单击编辑按钮展开编辑视图

 
为了实现此功能,我在相应的事件下添加了几行代码。

主要功能在 Grid View 的 On Row Update 事件处理程序中。

***********************
ROW UPDATING
***********************
protected void grdListEmployee_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            var empId = grdListEmployee.DataKeys[e.RowIndex].Values["Id"].ToString(); 
          
            TextBox txtName = (TextBox)grdListEmployee.Rows[e.RowIndex].FindControl("txtName");
            TextBox txtDepartment = (TextBox)grdListEmployee.Rows[e.RowIndex].FindControl("txtDepartment");
            TextBox txtAge = (TextBox)grdListEmployee.Rows[e.RowIndex].FindControl("txtAge");
            TextBox txtSalary = (TextBox)grdListEmployee.Rows[e.RowIndex].FindControl("txtSalary");
            Employee objEmp = new Employee();
            objEmp.Id = ObjectId.Parse(empId);
            objEmp.Name = txtName.Text;
            objEmp.Salary = txtSalary.Text;
            objEmp.Age =Convert.ToInt32(txtAge.Text);
            objEmp.Department = txtDepartment.Text;
            MONGOConnect objMC = new MONGOConnect();//Helper Class
            var collectionEmployee = objMC.GetMongoCollection("Employee");//Gets Employee Collection
            collectionEmployee.Save(objEmp);//Updates the Db with the empId
            grdListEmployee.EditIndex = -1;
            BindGridView();
        } 

我更新了名为 Raj 的记录。让我们看看 Raj 发生了什么。


所以我们成功地执行了所有的插入、列表和更新操作。

这对于 Mongo 初学者来说应该足够了。 

您可以在此处下载源代码 下载 MangoMONGO-noexe.zip     

结论 

最后我终于完成了,我以为我永远也完成不了……因为,随着我深入研究 Mongo 的特性以及 .Net API 提供的支持,我受到了启发,想写更多更多。最初我以为这个数据库可能只对 Java 有帮助,但现在我得出的结论是,它对 .Net 开发人员的支持远超 Java。API 制作精良,并支持 LINQ。

 

现在您认为它可扩展吗?我们能用 Mongo 替换 SQL 吗? 


 

 


 

 

 

 

© . All rights reserved.