主要介绍如何使用C#程序连接MongoDB数据库,实现增删改查操作。
在使用C#驱动的时候,要在工程中添加"MongoDB.Bson.dll"和"MongoDB.Driver.dll"的引用
Install-Package MongoDB.Driver -Version 2.6.1
Install-Package MongoDB.Bson -Version 2.6.1
一、连接数据库
方式1:直接连接
参考官网:https://docs.mongodb.com/guides/server/read/index.html
private IMongoCollection<BsonDocument> DatabaseConn()
{
// var client = new MongoClient("mongodb://$[username]:$[password]@$[hostlist]/$[database]?authSource=$[authSource]");
var client = new MongoClient("mongodb://localhost");
var database = client.GetDatabase("test"); //数据库名称
var collection = database.GetCollection<BsonDocument>("User");//连接的表名
return collection;
}
方式2:配置文件要写连接的数据库
private IMongoCollection<BsonDocument> DatabaseConn()
{
// 定义要查询的集合名称
const string collectionName = "User";
// 读取连接字符串
string strCon = ConfigurationManager.ConnectionStrings["mongodb"].ConnectionString;
var mongoUrl = new MongoUrlBuilder(strCon);
// 获取数据库名称
string databaseName = mongoUrl.DatabaseName;
// 创建并实例化客户端
IMongoClient _client = new MongoClient(mongoUrl.ToMongoUrl());
// 根据数据库名称实例化数据库
IMongoDatabase _database = _client.GetDatabase(databaseName);
// 根据集合名称获取集合
var collection = _database.GetCollection<BsonDocument>(collectionName);
return collection;
}
web.config
<connectionStrings>
<add name="mongodb" connectionString="mongodb://127.0.0.1:27017/test"/>
</connectionStrings>
连接的结果的如下:
二、添加数据
在MongoDB中,当用户对collection进行操作的时候可以有两种方式:
- 通过BsonDocument对象模型
- 通过自定义类型
例1:通过BsonDocument对象模型
public BsonDocument AddUser(int id, string name, int age)
{
var collection = DatabaseConn();//连接数据库,也就是上述的两种方法
BsonDocument user = new BsonDocument();
user.Add("UserId", id);
user.Add("UserName", name);
user.Add("Age", age);
//user.Add("hobby", new BsonArray() { "swimming","reading"});//随意增加,因为BsonDocument灵活支持各种文档模式
collection.InsertOne(user);
return user;//这边返回的类型BsonDocument
}
注:在MongoDB collection中,每个文档都可以看作一个Bson(Binary JSON)对象,所以在驱动中有个一个BsonDocument类型,可以通过上述的方式生成一个文档,并且通过Add方法添加键/值对。通过这种方式生成的BsonDocument对象可以直接插入collection中。
----------------------------------------------------------------------------------------
例2:通过自定义类型
public class User
{
public ObjectId _id;//BsonType.ObjectId 这个对应了 MongoDB.Bson.ObjectId
public int UserId { get; set; }//不可以取名为Id,因为已经被占用
public string UserName { get; set; }
public int Age { set; get; }
}
注:用自定义类型的时候一定要有Id字段,但不可取名为Id
public User AddUser(int id, string name, int age)
{
var collection = DatabaseConn();//连接数据库,也就是上述的两种方法
User user = new User();
user.UserId = id;
user.UserName = name;
user.Age = age;
collection.InsertOne(user.ToBsonDocument());
return user;//这边的返回类型User实体
}
上面两种方式都可以使用,而且各有好处,通过自定义类型的方式,可以使得collection中的文档有比较统一的模式;使用BsonDocument方式则可以支持更多的文档模式,也就是说如果一个collection中的文档拥有各种各样的模式,那么BsonDocument方式就会更灵活,就像上述的事例中hobby字段,不建议这么做,因为这样会对文档查询带来麻烦。
三、查询数据
Query Builder是一种更简洁的方式,当通过这种方式查询的时候,我们需要使用driver中的builder来生成query
public List<BsonDocument> QueryUser(string uname)
{
var collection = DatabaseConn();
//var filter = Builders<BsonDocument>.Filter.Eq("UserName", uname);//完全匹配
var filter = Builders<BsonDocument>.Filter.Regex("UserName", new BsonRegularExpression(uname));//模糊查询
var query = collection.Find(filter).ToList();//query这边的返回类型是List<BsonDocument>
#region //List<BsonDocument>转List<User>
//var result = new List<User>();
//foreach (var m in query)
//{
// var bsElements = m.Elements.ToList();
// var bsDocs = new BsonDocument();
// for (int i = 1; i < bsElements.Count(); i++)
// {
// bsDocs.SetElement(bsElements[i]);
// }
// string json = bsDocs.ToJson();
// var user = JsonHelper.ParseFormJson<User>(json);
// result.Add(user);
//}
#endregion
return query;//若执行转化,返回的类型就会变化
}
注:返回的类型若是List<BsonDocument>,需要在WebApiConfig加
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
目的是把XmlFormatter序列化方式去掉。因为火狐和Chrome显示的是xml,只有Ie才会得到json数据
(参考:https://www.cnblogs.com/uglyman/p/6890706.html?utm_source=itdadao&utm_medium=referral)
四、修改数据
public BsonDocument EditUser(int id, string name, int age)
{
var collection = DatabaseConn();//连接数据库,也就是上述的两种方法
// 1.Update
var filter = Builders<BsonDocument>.Filter.Eq("UserId", id);
var update = Builders<BsonDocument>.Update.Set("UserName", name).Set("Age", age);//这边返回的类型MongoDB.Driver.UpdateDefinition<BsonDocument>
collection.UpdateOne(filter, update);
// 2.Query
var query = Builders<BsonDocument>.Filter.Eq("UserId", id);
var model = collection.Find(query).FirstOrDefault();
return model;
}
五、删除数据
public void DeleteUser(int id)
{
var collection = DatabaseConn();//连接数据库,也就是上述的两种方法
var filter = Builders<BsonDocument>.Filter.Eq("UserId", id);
collection.DeleteOne(filter);
}
本文简单地介绍了C#操作mongodb的方法,对于mongodb的查询还有QueryDocument、Linq等,以及修改还有其他的方法,如Save(),删除Remove()等,并未涉及举例。虽然都能实现数据的操作,用户无感知,但是程序处理方式却不同,如文档更新的方法有Save()和Update()两种:其中Save()是整个文档替换,而Update()是文档的部分更新。
其它对文档操作的方法,可参考官网:https://docs.mongodb.com/manual/crud/