前言

在.net项目开发中,我们有时会用到mongodb数据库的场景,比如博主最近就在使用asp.net mvc改写此博客的管理后台(博客的数据库使用的就是mongodb),因此,就需要熟练掌握C#操作mongodb的一般方法。

安装MongoDB数据库操作驱动

MongoDB.Driver是MongoDB为C#提供的一种MongoDB数据库操作驱动,利用MongoDB.Driver 我们可以完成对MongoDB常用的增删改查。同时还需要用到MongoDB.Bson --序列化,JSON相关。

可以使用两种方式引用这两个dll文件:

方法一:使用 Nuget 程序包管理控制台,键入 Install-Package MongoDB.Driver 来为我们的程序安装 MongoDB 驱动,如下图所示:

1.png

Install-Package MongoDB.Driver -Version 2.4.4 -- 自行选择合适的版本

2.png

Install-Package MongoDB.Bson -Version 2.4.4

方法二:使用官方提供的mongo-csharp-driver,并选择合适的版本,下载后选择相应的dll文件引用到项目中。下载地址:https://github.com/mongodb/mongo-csharp-driver/downloads

引用到项目,即会如下图所示:

3.png

连接数据库

配置文件中配置连接字符串,如下图:

4.png

数据库访问服务层中实例化数据库连接对象:

代码:

/// <summary>
/// 
/// </summary>
private MongoClient _Client;
/// <summary>
/// 
/// </summary>
private MongoServer _Server;
/// <summary>
/// 
/// </summary>
private MongoDatabase _DataBase;
/// <summary>
/// 
/// </summary>
private MongoCollection<BsonDocument> _ArticleCollection;
/// <summary>
/// 
/// </summary>
public ArticlesService()
{
	string mongodb_ip = ConfigurationManager.AppSettings["mongodbIP"].ToString();
	_Client = new MongoClient(mongodb_ip);
	_Server = _Client.GetServer();
	_DataBase = _Server.GetDatabase("Blog");
	_ArticleCollection = _DataBase.GetCollection("article");
}

创建文章表实体类

/// <summary>
/// 博客文章表实体
/// </summary>
[BsonIgnoreExtraElements]
public class Article
{
/// <summary>
/// 文章唯一编号,mongodb自动编号
/// </summary>
public ObjectId Id { get; set; }
/// <summary>
/// 与Id组合,替换数据库中实际的_id字段,方便读取和查询及更新
/// 至于为什么不直接使用_id,还需研究,这里是多次实践出来的一种方法.
/// </summary>
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string uid { get; set; }
/// <summary>
/// 文章标题 
/// </summary>
public string title { get; set; }
/// <summary>
/// 文章简介
/// </summary>
public string summary { get; set; }
/// <summary>
/// 文章内容
/// </summary>
public string content { get; set; }
/// <summary>
/// 文章分类编号
/// </summary>
public string categoryId { get; set; }
/// <summary>
/// 修改时间
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime updateDate { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime createDate { get; set; }
}

增删改查实例

/// <summary>
/// 根据文章编号查询文章信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Article FindById(string id)
{
  return _ArticleCollection.FindOneByIdAs<Article>(new ObjectId(id));
}
/// <summary>
/// 添加新的文章
/// </summary>
/// <param name="ent"></param>
public void Insert(Article ent)
{
  _ArticleCollection.Insert(ent);
}
/// <summary>
/// 根据文章编号删除文章
/// </summary>
/// <param name="id"></param>
public void RemoveBy(string id)
{
  var query = Query<Article>.EQ(c => c.Id, new ObjectId(id));
  _ArticleCollection.Remove(query);
}
/// <summary>
/// 修改文章信息
/// </summary>
/// <param name="ent"></param>
public void Update(Article ent)
{
  BsonDocument bd = BsonExtensionMethods.ToBsonDocument(ent);
  var query = new QueryDocument("_id", new ObjectId(ent.uid));
  _ArticleCollection.Update(query, new UpdateDocument(bd));
}

最后并附上分页查询文章列表的方法:

/// <summary>
/// 分页加载文章列表
/// </summary>
/// <param name="pageModel"></param>
/// <returns></returns>
public PageResponse<Article> GetPageList(ArticlePage pageModel)
{
  IMongoQuery query = BuildWhere(pageModel.title, pageModel.categoryId);
  var datalist = _ArticleCollection.FindAs<Article>(query).OrderByDescending(c => c.createDate)
    .Skip((pageModel.page - 1) * pageModel.rows).Take(pageModel.page * pageModel.rows);
  var result = new PageResponse<Article>();
  result.rows = datalist;
  result.total = (int)GetPageCount(null);
  result.pageIndex = pageModel.page;
  return result;
}
/// <summary>
/// 查询文章总条数
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public long GetPageCount(DateTime? dt)
{
  IMongoQuery query = null;
  if (dt.HasValue)
  {
      query = Query.And(Query.GTE("createDate", Convert.ToDateTime(dt)), 
      Query.LTE("createDate", Convert.ToDateTime(dt).AddDays(1)));
  }
  return _ArticleCollection.Count(query);
}
/// <summary>
/// 拼接查询条件
/// </summary>
/// <param name="title"></param>
/// <param name="categoryId"></param>
/// <returns></returns>
private IMongoQuery BuildWhere(string title, string categoryId)
{
  IMongoQuery query;
  if (!string.IsNullOrWhiteSpace(title))
  {
    if (!string.IsNullOrWhiteSpace(categoryId))
  {
    query = Query.And(Query.Matches("title", new BsonRegularExpression(title, "i")), 
        Query.EQ("categoryId", new ObjectId(categoryId)));
  }
  else
  {
    query = Query.Matches("title", new BsonRegularExpression(title, "i"));
  }
  }
  else if (!string.IsNullOrWhiteSpace(categoryId))
  {
    query = Query.EQ("categoryId", categoryId);
  }
  else
   {
    query = null;
  }
  return query;
}

总结

以上就是一个C#操作MongoDB的增删改查的一个完整实例,实践是最好的老师,只有动手去做了,过程中的收获才真的是自己的。

作者: 一蓑烟雨

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

分类: ASP.NET MVC
posted 阅读(109 ) 评论(0 )

评论内容: