MongoDB的C#驱动基于.Net 3.5的 必要用.net 3.5以上的框架
1.对数据库的操作主要还是增删改查
2.了解c#操作mapreduce的语法
我们先布置驱动环境,再通过实例来了解一下相关操作语法。
方法一:驱动工程直接下载:
https://github.com/mongodb/mongo-csharp-driver/downloads
下载驱动。驱动有两个文件
可以直接下载这两个驱动,或者遵守下载源码进行编译生成。下载的源码可以看些test例子
方法二:驱动源码下载后编译得到驱动工程
地址:
https://github.com/mongodb/mongo-csharp-driver
下载的是源代码,进行编译后就可以得到MongoDB.Bson.dll,MongoDB.Driver.dll这两个驱动。
驱动说明:
http://docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/
驱动说明中文翻译:
http://www.bwxxkj.com/a/jishuzhongxin/shujukukaifa/2013/0109/160953.html
驱动API说明:
http://api.mongodb.org/csharp/current/
下面通过实例操作来熟悉一下:
引入驱动:
在新建的c#工程中添加这两个dll文件并引用它们,并且应用如下定名空间
至少要引用如下定名空间
using MongoDB.Bson;
using MongoDB.Driver;
用得比较多的命名空间
using MongoDB.Driver.Builders; using MongoDB.Driver.GridFS; using MongoDB.Driver.Linq;
using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Conventions; using MongoDB.Bson.Serialization.IdGenerators; using MongoDB.Bson.Serialization.Options; using MongoDB.Bson.Serialization.Serializers; using MongoDB.Driver.Wrappers;
引用它们
添加命名空间
好 可以用了 下面开始进行操作
对mongodb的数据进行操作有两种方法:
1.先构造好类的结构,用这个结构操作数据。
2.直接操作数据。
插入数据:
方法一:
增加一个Student类,构建student的构造。
类的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace mymongotest { class Student_Insert { public string 姓名{get;set;} public string 学号{get;set;} public Information[] 个人信息{get;set;} } class Information { public string Name { get; set; } public string Value { get; set; } } }
引用命名空间:
using MongoDB.Bson.Serialization; using MongoDB.Driver.Builders;
插入按钮的代码:
private void button1_Click(object sender, EventArgs e) { MongoClient client; MongoServer server; MongoDatabase database; var conStr = "mongodb://192.168.0.188"; client = new MongoClient(conStr); server = client.GetServer(); database = server.GetDatabase("test"); var coll = database.GetCollection("student"); var sInsert = @"{""姓名"":""刘备"",""学号"":""001"", ""个人信息"":[ {""Name"":""性别"",""Value"":""男""}, {""Name"":""班级"",""Value"":""1班""}, {""Name"":""专业"",""Value"":""物理""} ] }"; var bd = BsonSerializer.Deserialize<Student_Insert>(sInsert); coll.Insert(bd); MessageBox.Show("入库结束"); }
用MongoVue查看结果
插入成功
方法二:
不构造类结构,直接创建文档插入数据。可以根据你的需要构造成不同的格式。
这里 我们构造跟方法一一样的格式:
MongoClient client; MongoServer server; MongoDatabase database; var conStr = "mongodb://192.168.0.188"; client = new MongoClient(conStr); server = client.GetServer(); database = server.GetDatabase("test"); var coll = database.GetCollection("student"); BsonDocument bd = new BsonDocument(); bd.Add(new BsonElement("姓名", "赵云")); bd.Add(new BsonElement("学号", "002")); //个人信息格式构造一: bd.Add(new BsonDocument{{"个人信息",new BsonDocument{{"性别","男"},{"班级","1班"},{"专业","数学"}}}}); /* 个人信息格式构造二: BsonArray ba = new BsonArray(); BsonDocument information = new BsonDocument(); information.Add(new BsonElement("性别", "男")); information.Add(new BsonElement("班级", "002")); information.Add(new BsonElement("专业", "数学")); ba.Add(information); bd.Add(new BsonDocument("个人信息", ba)); */ //个人信息格式3 //BsonArray ba = new BsonArray(); //ba.Add(new BsonDocument("性别", "男")); //ba.Add(new BsonDocument("班级", "002")); //ba.Add(new BsonDocument("专业", "数学")); //bd.Add(new BsonDocument("个人信息", ba)); //个人信息格式4 BsonArray ba = new BsonArray(); ba.Add(new BsonDocument { { "Name", "性别" }, { "Value", "男" } }); ba.Add(new BsonDocument { { "Name", "班级" }, { "Value", "2班" } }); ba.Add(new BsonDocument { { "Name", "专业" }, { "Value", "物理" } }); bd.Add(new BsonDocument("个人信息", ba)); coll.Insert(bd); MessageBox.Show("入库结束");
结果如下:
插入成功
查询数据:
在已建的类Student代码里添加类结构:Student_Query
添加后类Student.cs的代码为:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace mymongotest { class Student_Insert { public string 姓名{get;set;} public string 学号{get;set;} public Information[] 个人信息{get;set;} } class Information { public string Name { get; set; } public string Value { get; set; } } class Student_Query { public Object _id { get; set; } public string 姓名 { get; set; } public string 学号 { get; set; } public Information[] 个人信息 { get; set; } } }
情景一:通过索引值取数据----通常用于取上一条,下一条数据。(用到类结构)
在窗体下声明集合coll和浮标cucor:
MongoCollection<Student_Query> coll; MongoCursor<Student_Query> cursor;声明位置如图:
查询按钮的代码:
private void button3_Click(object sender, EventArgs e) { MongoClient client; MongoServer server; MongoDatabase database; var conStr = "mongodb://192.168.0.188"; client = new MongoClient(conStr); server = client.GetServer(); database = server.GetDatabase("test"); coll = database.GetCollection< Student_Query>("student"); cursor = coll.FindAll(); var ex = cursor.ElementAt< Student_Query>(0);//取第一个数据 string sResult = ""; sResult = string.Format("{0}{1}{2}{3}{4}", ex.姓名, ex.学号, ex.个人信息[0].Value, ex.个人信息[1].Value, ex.个人信息[2].Value); MessageBox.Show(sResult); }
情景二:用条件查询
情景二方法一:(用类结构)
查询按钮代码如下:
MongoClient client; MongoServer server; MongoDatabase database; var conStr = "mongodb://192.168.0.188"; client = new MongoClient(conStr); server = client.GetServer(); database = server.GetDatabase("test"); coll = database.GetCollection<Student_Query>("student"); // var bs = coll.FindOne(Query.EQ("_id", new ObjectId("512c14c211f9d518809d8d0c"))); var bs = coll.FindOne(Query.EQ("姓名", "赵云")); string sResult = ""; sResult = string.Format("{0}{1}{2}{3}{4}", bs.姓名, bs.学号, bs.个人信息[0].Value, bs.个人信息[1].Value, bs.个人信息[2].Value); MessageBox.Show(sResult);
结果:
情景二方法二:(不用类结构)
查询按钮代码如下:
MongoClient client; MongoServer server; MongoDatabase database; var conStr = "mongodb://192.168.0.188"; client = new MongoClient(conStr); server = client.GetServer(); database = server.GetDatabase("test"); var coll = database.GetCollection("student"); // var bs = coll.FindOne(Query.EQ("_id", new ObjectId("512c14c211f9d518809d8d0c"))); var bs = coll.FindOne(Query.EQ("姓名", "赵云")); string sResult = ""; sResult = string.Format("{0}{1}{2}{3}{4}", bs.AsBsonDocument["姓名"].ToString(), bs.AsBsonDocument["学号"].ToString(), bs.AsBsonDocument["个人信息"].AsBsonArray[0].AsBsonDocument["Value"].ToString(), bs.AsBsonDocument["个人信息"].AsBsonArray[1].AsBsonDocument["Value"].ToString(), bs.AsBsonDocument["个人信息"].AsBsonArray[2].AsBsonDocument["Value"].ToString()); MessageBox.Show(sResult);
结果:
查询常用语句:
求文档长度
var bs = coll.FindAll(); string i= bs.Count().ToString();求文档中数组长度
var bs = coll.FindOne(Query.EQ("姓名", "赵云")); string i = bs.AsBsonDocument["个人信息"].AsBsonArray.Count().ToString();
if (bs.AsBsonDocument.Contains("姓名"))
遍历一个文档中的所有属性:
var bs = coll_fieldConnect.FindOne(Query.EQ("id", process_id)); StringBuilder sb = new StringBuilder(); foreach (BsonElement d in bs) { sb.AppendFormat("{0}:\t{1}\n", d.Name, d.Value); } richTextBox1.Text = sb.ToString();
修改数据:
修改按钮代码如下:
MongoClient client;
MongoServer server;
MongoDatabase database;
var conStr = "mongodb://192.168.0.188";
client = new MongoClient(conStr);
server = client.GetServer();
database = server.GetDatabase("test");
var coll = database.GetCollection("student");
BsonDocument bd = new BsonDocument();
bd.Add(new BsonElement("姓名", "赵云"));
bd.Add(new BsonElement("学号", "002"));
BsonArray ba = new BsonArray();
ba.Add(new BsonDocument { { "Name", "性别" }, { "Value", "男" } });
ba.Add(new BsonDocument { { "Name", "班级" }, { "Value", "1班" } });
ba.Add(new BsonDocument { { "Name", "专业" }, { "Value", "数学" } });
bd.Add(new BsonDocument("个人信息", ba));
IMongoQuery query = Query.EQ("学号", "002");
coll.Update(query, new UpdateDocument(bd)); MessageBox.Show("修改结束");
结果如下: 转专业班级成功
删除数据:
删除按妞的代码如下:
private void button2_Click(object sender, EventArgs e) { MongoClient client; MongoServer server; MongoDatabase database; var conStr = "mongodb://192.168.0.188"; client = new MongoClient(conStr); server = client.GetServer(); database = server.GetDatabase("test"); var coll = database.GetCollection("student"); IMongoQuery query = Query.EQ("学号", "002"); coll.Remove(query); MessageBox.Show("删除结束"); }
删除成功
2.对mapreduce的操作语法
我们先在mongovue中测试好要用的mapreduce
这里我们写一个统计文档数的mapreduce,详见mongodb mapreduce分析
得到结果为 文档数为1
用c#实现这个功能 按钮代码为:
private void button5_Click(object sender, EventArgs e) { MongoClient client; MongoServer server; MongoDatabase database; var conStr = "mongodb://192.168.0.188"; client = new MongoClient(conStr); server = client.GetServer(); database = server.GetDatabase("test"); var coll = database.GetCollection("student"); BsonJavaScript map = new BsonJavaScript(@" function map() { emit( 1, {count: 1} ); }"); BsonJavaScript reduce = new BsonJavaScript(@"function(key,values){ var total=0; values.forEach(function(val) { total += val.count; }); return total; };"); var result = coll.MapReduce(map, reduce); string count = ""; foreach (var s in result.InlineResults) { count = s.AsBsonDocument["value"].AsBsonDocument["count"].ToString(); } MessageBox.Show(count); }
结果: