前言

前面《C#操作mongodb — 增删改查》一文中已经介绍了MongoDB的基本用法,但最近发现里面的方法已经.不出来了,无法使用,所以有了本篇文章,记录一下MongoDB的一些新的调用方法。

MongoDB服务层实例化

这里以ArticleService为例(文章服务层),如何实例化数据库访问对象,方法与前面基本类似,代码如下:

private MongoClient _client;
private IMongoDatabase _dataBase;
private IMongoCollection<Article> _collection;
public ArticleService()
{
    _client = new MongoClient(mongodb_ip);
    _dataBase = _client.GetDatabase("Blog");
    _collection = _dataBase.GetCollection<Article>("article");
}

查询(Query)

/// <summary>
///  查询单篇文章
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Article FindOne(string id)
{
    Expression<Func<Article, bool>> filters = null;
    filters = c => c.id.Equals(id);//Expression表达式构建查询条件
    return _collection.Find(filters).FirstOrDefault();
}

/// <summary>
///  异步获取单个文章,利用async和await实现异步
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Article> FindOneBy(string id)
{
    Expression<Func<Article, bool>> filters = null;
    filters = c => c.id.Equals(id);
    return await _collection.Find(filters).FirstOrDefaultAsync().ConfigureAwait(false);
}

/// <summary>
///  文章分页列表
/// </summary>
/// <param name="pageModel"></param>
/// <returns></returns>
public PageResponse<Article> GetPageList(ArticlePage pageModel)
{
    PageResponse<Article> response = new PageResponse<Article>();
    int skipCount = (pageModel.id - 1) * pageModel.rows;
    Expression<Func<Article, bool>> filters = null;
    // 多条件查询,这里有一个问题,Expression表达式如何动态拼接同时满足多个条件时的查询?
    // 我这里虽然也能满足需求,但当条件更多时,判断条件这样写会很复杂,且易错
    // 若有更好的方法,欢迎留言
    if (!string.IsNullOrWhiteSpace(pageModel.title))
        filters = c => c.title.Contains(pageModel.title) && c.isDel == false;
    if (!string.IsNullOrWhiteSpace(pageModel.categoryId))
        filters = c => c.categoryId.Equals(pageModel.categoryId) && c.isDel == false;
    if (!string.IsNullOrWhiteSpace(pageModel.title) && !string.IsNullOrWhiteSpace(pageModel.categoryId))
        filters = c => c.categoryId.Equals(pageModel.categoryId) && c.title.Contains(pageModel.title) && c.isDel == false;
    if (string.IsNullOrWhiteSpace(pageModel.title) && string.IsNullOrWhiteSpace(pageModel.categoryId))
        filters = c => c.isDel == false;

    response.total = _collection.Find(filters).ToListAsync().Result.Count;
    response.pageIndex = pageModel.id;
    response.pageSize = pageModel.rows;
    response.rows = _collection.Find(filters).SortByDescending(c => c.createDate).Skip(skipCount).Limit(pageModel.rows).ToListAsync().Result;
    return response;
}

其中在使用异步查询单篇文章时,controller里调用此接口的方法是:

Article article = articleService.FindOneBy(id).Result;

QQ截图20190905001527.png

增删改(Insert Update Delete)

/// <summary>
///  新增
/// </summary>
/// <param name="article"></param>
public void Insert(Article article)
{
   _collection.InsertOne(article);
}
/// <summary>
///  修改
/// </summary>
/// <param name="article"></param>
/// <returns></returns>
public UpdateResult Update(Article article)
{
   var filter = Builders<Article>.Filter.Where(c => c.id == article.id);
   var update = Builders<Article>.Update.Set(d => d.isDel, true);
   return _collection.UpdateOne(filter, update);
}
/// <summary>
///  删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public DeleteResult Delete(string id)
{
   var filter = Builders<Article>.Filter.Where(c => c.id == id);
   return _collection.DeleteOne(filter);
}

小结

当然这里也只是MongoDB新的使用方法中的一些基本尝试和实践,至于是否是最优或性能最好的写法,还需进一步学习研究。。。

作者: 一蓑烟雨

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

分类: MongoDB
posted 阅读(38 ) 评论(0 )

评论内容: