[TOC]
# 一、前言
现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度。但是作为程序员的我们,既然大部分公司都需要有NOSQL的使用经验,自然我们就应该学习起来了。所以也就有了这个系列了。NOSQL包括很多,但是使用最大的还是属于MongoDB和Redis。所以在本系列中将详细介绍下这两种非关系数据库的环境搭建和一些常规使用。本专题就首先介绍下MongoDB开发环境的搭建和完成一些简单的增删改查操作。下面就随着我一起去学习吧。
# 二、MongoDB开发环境搭建
MongoDB的开发环境的搭建相对来说还是很简单的,尽管说MongoDB是非关系数据库,但是和关系型数据(如SQL Server)一样,都是用来持久化数据的。自然和非关系型数据目的是一样的,其开发方式也是非常类似的。大家都知道,在对SQL Server进行操作时,需要搭建一个SQL Server服务器,然后用.NET的相关技术充当客户端来对SQL Server服务器进行操作,来完成对数据的持久化保存操作。所以,对于MongDB的开发模式也是一样的,只是它们之间持久化的数据格式不一样而已。SQL Server等关系型数据库都是以表来保存数据的,而MongoDB等非关系型数据库都是以JSON格式来保存数据的。
既然,它们的开发模式是一样的,在之前我们对SQL Server操作都是首先需要连接SQL Server服务器,然后本地开发需要引入SQL Server驱动来进行开发。所以MongoDB的开发环境的搭建也不例外。
首先,我们需要去MongoDB下载MongoDB。下载地址:[https://www.mongodb.org/downloads](https://www.mongodb.org/downloads)。由于,我的操作系统是32位的,所以我这里下载的版本就是32位3.0.4版本。下载下来后,然后进行解压。
其实,到这里,MongoDB的开发环境就完成了。这里大家肯定会问,不会吧,这么快,以前SQL Server安装程序可是要安装很久的啊,怎么MongoDB这么快就好?此时大家千万不要疑惑,此时开发环境真的已经大家好了。下面就让我们看看如何通过来完成对MongoDB的增删改查操作。
# 三、基本操作
首先,打开命令行工具,然后切换到你MongoDB所在的目录。通过允许mongod.exe程序来启动MongoDB服务器,同时还需要用--dbpath参数来指定数据存放的文件夹。如果不指定参数将不能成功启动MongoDB服务,具体的命令如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad3652244.png)
通过上图可以看到,我们的MongoDB服务已经启动成功了,MongoDB默认监听的端口就是27017。下面就通过浏览器来验证下MongoDB服务是否启动成功了。输入地址:[http://localhost:27017/](http://localhost:27017/)。打开后,如果看到如下图所示的结果,就表明MongoDB服务已经启动成功了。
![](https://box.kancloud.cn/2015-08-04_55c0ad3676522.png)
既然,MongoDB服务已经启动了,接下来就需要客户端对服务器进行请求来完成把数据保存到服务器上。我们同样可以通过命令行的方式来启动MongoDB的客户端,重新打开一个命令行工具,通过mongo.exe命令来启动MongoDB的客户端。具体命令如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad3695b86.png)
从上图可以看到,客户端默认链接的是"test"数据库,就如SQL Server默认链接的是master数据库一样。既然,我们客户端和服务器都已经准备好了,接下来就需要在客户端通过命令来发出对服务器的请求,来完成增删改查操作。
数据库我们已经有了,即"test"数据库,按照常规的数据库操作,我们需要创建一个表,然后往表里插入一条数据。但是在非关系数据库中,并没有表的概念,只有集合的概念,大家可以把非关系数据库中集合的概念理解为关系数据库中表的一个概念。并且在MongoDB中并不需要单独的创建集合命令,因为在插入的数据的同时也会完成集合的创建。这里把需要创建的集合命名为"person"。通过**insert()方法**来完成数据的插入。具体的命令如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad36aff5b.png)
通过上面可以看出,我们已经成功像person集合插入了2条记录。可以通过find()方法来查询下集合person中是否现在已经存在2条记录。具体的查找命令如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad36c98dd.png)
从图中可以发现,我们确实已经成功插入了2条记录了,并且MongoDB服务已经自动为其加入_id这个字段,该字段的值也是由MongoDB服务默认为我们生成的GUID,来保证数据的唯一性。除此之外,我们还可以指定特定的筛选条件来筛选记录。具体命令如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad36e8d28.png) 接下来,我们可以通过update()和remove()方法来完成数据的删除和更新。具体的命令和效果如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad3757c50.png)
update方法的第一个参数为“查询条件”,第二个参数为“更新的值”。remove方法如果不带参数将删除所有数据**(db.person.remove( { } ))**。带参数指的是“查询条件”,即删除掉查询到的数据。
通过上面,我们就完成了MongoDB的增删改查操作了。上面,我们是通过命令行的方式来完成的,但是这样的方式未免有些不方便,此时就想:有没有什么GUI的工具来完成这些操作呢?就如SQL Server的客户端那样。对于这点,答案是肯定的,这里我用的是“MongoVUE 1.5.3”版本,个人觉得还是蛮还用的,大家可以去百度云盘去下载破解版的。下面让我们通过MongoDB客户端的GUI工具来查询下刚才我们插入的数据,打开“MongoVUE”工具,然后点Connect按钮来创建链接,连接就如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad378153f.png)
链接成功之后,我们就可以看到类似SQL Server那样的数据库结构界面了,具体的效果如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad3796299.png)
并且通过GUI客户端工具可以很方便地完成增删改查操作,而不需要手敲命令去完成。
# 四、通过C#来操作MongoDB
上面已经介绍了通过命令行和客户端GUI工具来完成对MongoDB的操作,但是实际开发过程中,我们用的更多还是通过代码来完成数据的持久化。下面就简单介绍下,如果通过C#语言来完成对MongoDB的增删改查操作。
同样,我们用C#来操作MongoDB,一样也需要启动MongoDB服务器,只有服务启动了,我们才能对其操作,说白了我们的程序就是充当一个客户端,然后通过C#语言来发送命令让MongoDB服务器执行相应的增删改查操作,但是之前MongoDB服务宿主在控制台中的,这样的宿主方式太过于麻烦了。因为每次服务重启之后,还需要手动通过命令行方式来启动服务。然而服务一般都是让其自启动的。所以MongoDB服务也可以宿主支持宿主在Windows服务中。首先,以管理员权限启动命令行,然后输入如下命令来将MongoDB宿主在Windows服务中:
mongod --dbpath=F:\Study\No-Sql\MongoDB\data --logpath=F:\Study\No-Sql\MongoDB\log\mongolog.txt --port 2322 --install.
具体的运行效果如下图所示:
![](https://box.kancloud.cn/2015-08-04_55c0ad37ba83f.png)
从上图可以看出,我们还可以通过--remove命令来移除服务,并且在指定logpath和dbpath参数的时候必须指定为绝对路径,否则会出现错误,并且指定logpath参数的值时,文件名必须要指定,如果文件在指定目录下存在的话会报出警告说文件名已存在,已将日志移动另外一个日志文件下了,但是这不影响,服务依然可以安装成功。关于mongod.exe的更多命令可以通过 mongod /help来查看。创建成功后,你将在Windows服务列表将查看到。然后进行启动即可。这样每次服务重启就不需要手动去执行命令行了,服务会指定重启。
下面我们还是回到正题。在使用C#操作MongoDB服务器之前,我们还需要下载对应的驱动程序,这样才能通过C#来访问到服务器,这里通过Nuget来下载官方的“MongoDB.Driver”驱动,下载完成之后,就可以用C#代码来调用驱动中的API来操作mongoDB。其操作代码基本与命令行的方式差不多,这里就不一一解释了,大家可以自行看下面的代码和参考命令行来进行理解。具体的代码如下所示:
~~~
using System.Collections.Generic;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace MongodbDemo
{
class Program
{
static void Main(string[] args)
{
var mongodbHelper =new MongodbHelper();
//var updateTask = mongodbHelper.Update(new Person() { Name = "LearninghardUpdate", Age = 25 });
//updateTask.Wait();
var taskAdd = mongodbHelper.Add(new Person() { Id = ObjectId.GenerateNewId().ToString(), Name = "Learninghard2", Age = 25 });
taskAdd.Wait();
foreach (var person in mongodbHelper.SelectAll())
{
Console.WriteLine("Name: {0}, Age: {1}", person.Name, person.Age);
}
Console.Read();
}
}
public class MongodbHelper
{
private const string Conn = "mongodb://localhost:2322";
private const string DbName = "test";
private const string TbName = "person";
private readonly MongoClient client;
private readonly IMongoDatabase dbDatabase;
public MongodbHelper()
{
// 创建数据连接
client = new MongoClient(Conn);
// 获取指定数据库
dbDatabase = client.GetDatabase(DbName);
}
public async Task Add(Person p)
{
// 获取表
var collection = dbDatabase.GetCollection<Person>(TbName);
// 插入
await collection.InsertOneAsync(p);
}
public async Task Delete(string name)
{
var collection = dbDatabase.GetCollection<Person>(TbName);
var filter = Builders<Person>.Filter.Eq("Name", name);
await collection.DeleteOneAsync(filter);
}
public async Task Update(Person p)
{
//获取表
var col = dbDatabase.GetCollection<Person>(TbName);
var filter = Builders<Person>.Filter.Eq("Age", p.Age);
var update = Builders<Person>.Update.Set("Name", p.Name);
await col.UpdateManyAsync(filter, update);
}
public Person SelectOne(string name)
{
var collection = dbDatabase.GetCollection<Person>(TbName);
var filter = Builders<Person>.Filter.Eq("Name", name);
var person = collection.Find(filter).FirstAsync().Result;
return person;
}
public IEnumerable<Person> SelectAll()
{
var persons =new List<Person>();
var collection = dbDatabase.GetCollection<Person>(TbName);
var result = collection.Find(p => true).ToListAsync();
result.Wait();
persons.AddRange(result.Result);
return persons;
}
}
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}
~~~
具体的运行效果这里就不贴图了,大家可以自行下载代码进行运行查看。
# 五、总结
到此,本专题的内容就介绍结束,本专题只是简单介绍了MongoDB开发环境的搭建和通过命令行和MongoDB GUI工具来对MongoDB进行操作,最后介绍了在实际开发环境中,通过C#来操作MongoDB以及将MongoDB宿主在Windows服务中。本专题只是一个开始,希望本专题可以使得大家对MongoD可以快速入门。接下来的专题将介绍MongoDB索引、集群和故障转移的支持。
本专题所有源码下载:[http://files.cnblogs.com/files/zhili/MongoDBQuickStart.zip](http://files.cnblogs.com/files/zhili/MongoDBQuickStart.zip)
> 原文出处:http://www.cnblogs.com/zhili/p/MongodbQuickStart.html