前言:MongoDB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象。Mongo DB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD(增删改查)操作。
一.准备工作
1.下载MogonDB文件包,百度云地址:链接:http://pan.baidu.com/s/1kT7YB9X 密码:lq0q
2.压缩您刚才下载的MongoDB的zip压缩包,进入解包的bin目录,然后Windows+R 快捷键调出命令行窗口并切换到刚才的bin目录,然后输入以下命令:
这里我们运行了Mongod.exe,并指定了数据文件的保存目录(当然这个目录要实现建立好),看到了这个界面,那么表示MongoDB的服务端已成功启动了。
接下来,我们还要去下载MongoDB的C#驱动,它可以让我们在C#中使用MongoDB 。下载地址: https://github.com/samus/mongodb-csharp
我下载到的压缩包是:mongodb-csharp-master.zip。我们在C#访问MongoDB所需的驱动就是类库项目MongoDB了。编译这个项目就能得到了,文件名:MongoDB.dll
二.调用MongoDB
1)在C#中使用(建立一个测试程序)
1.接下来,本文演示通过C#完成【客户资料】的一些基本的数据操作,还是先来定义一个客户资料的类
public class Customer
{
[MongoId]
public string CustomerID { get; set; }
public string CustomerName { get; set; }
public string ContactName { get; set; }
public string Address { get; set; }
public string PostalCode { get; set; }
public string Tel { get; set; }
}
MongoDB在使用前,并不要求您事先创建好相应的数据库,设计数据表结构。
在MongoDB中,没有【表】的概念,取而代之的是【集合】,也没有【数据记录】的概念,取而代之的是【文档】, 我们可以把【文档】理解成一个【对象】,任意的对象,甚至可以有复杂的嵌套层次。
因此,我们不用再写代码从【数据表字段】到C#类的【属性,字段】的转换了,现在直接就可以读写整个对象了。
而且MongoDB不支持Join操作,所以,如果有【关联】操作,就需要你自己来处理。
下面来定义C#的增删改查操作:
///
/// 数据实体类
///
public class Customer
{
[MongoId]//此处的特性驱动程序将把CustomerID映射为"_id"来使用 也就是说此处的CustomerID的值无论你写不写 无论你写什么
//最后得到的都是一个_id 然后CustomerID会不存在了 而主键值就变成了_id
public string CustomerID { get; set; }
public string CustomerName { get; set; }
public string ContactName { get; set; }
public string Address { get; set; }
public string PostalCode { get; set; }
public string Tel { get; set; }
public override string ToString()
{
return string.Format("CustomerID:{0},CustomerName:{1},ContactName:{2},Address:{3},PostalCode:{4},Tel:{5}",
CustomerID, CustomerName, ContactName, Address, PostalCode, Tel);
}
}
///
/// 对MongoDB和MongoDb的包装类
///
public class MyMongoDb : IDisposable
{
public void Dispose()
{
if (_mongo != null)
{
_mongo.Dispose();
_mongo = null;
}
}
private Mongo _mongo;
private IMongoDatabase _db;
public MyMongoDb()
: this("Server=127.0.0.1", "MyDB")
{
}
///
/// 构造函数。根据指定连接字符串和数据库名
///
/// 连接字符串
/// 数据库名,可为空,但必须在任何操作数据库之前要调用UseDb()方法
public MyMongoDb(string connectionString, string dbName)
{
if (string.IsNullOrEmpty(connectionString))
throw new ArgumentNullException("connectionString");
_mongo = new Mongo(connectionString);
// 立即连接 MongoDB
_mongo.Connect();
if (string.IsNullOrEmpty(dbName) == false)
_db = _mongo.GetDatabase(dbName);
}
///
/// 切换到指定的数据库
///
///
///
public IMongoDatabase UseDb(string dbName)
{
if (string.IsNullOrEmpty(dbName))
throw new ArgumentNullException("dbName");
_db = _mongo.GetDatabase(dbName);
return _db;
}
///
/// 获取当前连接的数据库
///
public IMongoDatabase CurrentDb
{
get
{
if (_db == null)
throw new Exception("当前连接没有指定任何数据库。请在构造函数中指定数据库名或者调用UseDb()方法切换数据库。");
return _db;
}
}
///
/// 获取当前连接数据库的指定集合【依据类型】
///
///
///
public IMongoCollection GetCollection() where T : class
{
return this.CurrentDb.GetCollection();
}
///
/// 获取当前连接数据库的指定集合【根据指定名称】
///
///
/// 集合名称
///
public IMongoCollection GetCollection(string name) where T : class
{
return this.CurrentDb.GetCollection(name);
}
}
public class Handle
{
public string Insert(Customer customer)
{
customer.CustomerID = Guid.NewGuid().ToString("N");
using (MyMongoDb mm = new MyMongoDb())
{
mm.GetCollection().Insert(customer);
}
return customer.CustomerID;
}
public void Delete(string customerId)
{
using (MyMongoDb mm = new MyMongoDb())
{
mm.GetCollection().Remove(c => c.CustomerID == customerId);
}
}
public string Update(Customer customer)
{
using (MyMongoDb mm = new MyMongoDb())
{
mm.GetCollection().Update(customer, (c => c.CustomerID == customer.CustomerID));
}
return customer.CustomerID;
}
public Customer GetCustomerById(string customerId)
{
using (MyMongoDb mm = new MyMongoDb())
{
return mm.GetCollection().FindOne(c => c.CustomerID == customerId);
}
}
}
接下来我们调用一下:
class Program
{
static void Main(string[] args)
{
Handle hd = new Handle();
string id1 = hd.Insert(new Customer() { CustomerID="001",Address = "bj1", ContactName = "cn1", CustomerName = "name1", PostalCode = "1", Tel = "10086" });
Console.WriteLine(hd.GetCustomerById(id1).ToString());
string id2 = hd.Insert(new Customer() { CustomerID="002",Address = "bj2", ContactName = "cn2", CustomerName = "name2", PostalCode = "2", Tel = "10086" });
Console.WriteLine(hd.GetCustomerById(id2).ToString());
string id3 = hd.Update(new Customer() { CustomerID = id1, Address = "bj2", ContactName = "cn2", CustomerName = "name2", PostalCode = "2", Tel = "10086" });
Console.WriteLine(hd.GetCustomerById(id3).ToString());
hd.Delete(id3);
if (hd.GetCustomerById(id3) == null)
{
Console.WriteLine("删除Id为" + id3 + "的数据成功!");
}
else
{
Console.WriteLine(hd.GetCustomerById(id3).ToString());
}
Console.Read();
}
}
输出结果如下:
2)使用MongoDB的客户端
2.1)查看数据
MongoDB自带一个Javascript shell,它可以从命令行与MongoDB实例交互。这个shell非常有用,通过它可以管理操作、检查运行实例、查询数据等操作。
让我们再回到命令行窗口模式下吧(没办法,MongoDB只提供这种界面),运行mongo.exe ,如下:
这就是MongoDB的客户端的命令行模式了。通常我们在操作数据库前,要切换【当前数据】,
MongoDB也是一样,我们可以运行如下命令来查看数据库列表,并切换数据库,然后再查看集合列表,请看下图(我运行了三条命令):
注意:MongoDB区分名字的大小写。
在MongoDB中,查看【当前数据库】,可以使用命令【db】,
查看集合Customer的记录总数:【db.Customer.count();】
查看 CustomerId = 41c0a06fcc414639843deb281cc214c7 的记录:【db.Customer.findOne({"_id" : "41c0a06fcc414639843deb281cc214c7"});】,注意:查询条件是一个文档,这就是MongoDB的特色。
下图显示了上面三条命令的执行结果:
注意:此处如果你查询的字符串中有汉字乱码情况那么考虑这个问题是和cmd.exe有关。
2.2)维护数据
下面我来演示一下如何使用MongoDB的客户端来执行一些基本的数据维护功能。还是从CRUD操作开始吧,请看下图,为了方便,我将在一个截图中执行多个命令。
注意:MongoDB的文档使用的是一种称为BSON格式的对象,与Javascript中的JSON类似。
在示例中,我先切换到 MyTest 数据库(它并不存在,但没关系), 然后我定义了一个文档 item 并插入到集合 table1 中,然后又定义了一个文档 item2,也插入到集合 table1 中。此时,您有没有注意到:【每个文档有一个名为 "_id" 的成员】,我并没有定义。
其实,MongoDB会为每个文档都创建这样一个文档成员,我们指定的 "key"对于MongoDB来说: 它们并不是【文档的主键】,MongoDB只认 "_id",你可以指定,但如果不指定,MongoDB就自动添加。此时也解答了为什么在用C#代码实现CRUD操作时候会有一个MongoId的特性。正是由于这个特性,驱动程序将把CustomerID映射为"_id"来使用。
为了要更新某个文档,我们要使用findOne()方法找到要修改的文档对象,并将它保存一个变量t中,然后,修改它的属性, 接着调用update()方法就可以更新文档了,注意在调用update()时,第一个参数【更新范围】是采用文档的形式给出的, 第二参数才是要更新的新对象。在删除时,删除条件也是采用文档的形式指定的。处处使用文档,这就是MongoDB的特色:
前面用的find()和findOne(),它们是有区别的:findOne()只返回一个文档对象,find()返回一个集合列表, 如果不指定过滤范围,它将返回整个集合,但在客户端中最多只显示前20个文档。
当然MongoDB的东西还有很多,我也是初认识,以后再多多研究吧。