设为首页 收藏本站
查看: 2102|回复: 0

[经验分享] MongoDB结合Flexgrid的简单数据呈现

[复制链接]

尚未签到

发表于 2015-7-6 09:00:20 | 显示全部楼层 |阅读模式
  
  本示例以常用的:用户,帖子,评论为基础模型,实现了一个简单的MongoDB结合Flexgrid数据呈现的Demo。由于时间所限,功能上仅提供对MongoDB数据的常用查询操作(分页,排序,查询等)。高手请对我这种菜鸟多些包容。
  
  一,准备工作:
  MongoDB官方下载:
http://www.mongodb.org/
当前最新版本是2.2.0版本。话说,MongoDB的版本更新是相当的快。
  
  本示例使用的MongoDB C#版驱动下载:
https://github.com/samus/mongodb-csharp
该驱动附源码和示例程序,有兴趣的朋友可以研究一下,对自己的编码能力会有很大的提高。用VS打开Source文件夹,编译后得到程序集,在自己的项目中引用即可。
  
  这是官方邮件提供的 C#版驱动:
https://github.com/mongodb/mongo-csharp-driver/downloads
版本很多,而且基本上都是十多兆的东西,然后,没有然后。
  
  如果你不习惯以命令行的方式对MongoDB进行操作和管理。推荐以下客户端管理工具:
1,MongoVUE。这应该是目前应用最广的了。
下载地址:http://www.mongovue.com/
  2,博客园高手自己开发的MongoDB管理工具:
http://www.iyunv.com/texteditor/archive/2012/03/31/2427195.html
试用了一下,也是相当不错的!
  
  虽然上述管理工具能够以图形化的方式与MongoDB交互,但强烈建议你运行mongo.exe客户端,以命令行的方式对MongoDB进行操作和管理,这会让你对MongoDB有更加直观而深刻的体会。另外,Windows8依然内置了DOS。
  
  这里有MongoDB的常用命令:
http://blog.iyunv.com/shirdrn/article/details/7105539
  
  这是Flexgrid的官方网站:
http://flexigrid.info/
页面顶部有一个硕大的红色Download按钮。
  
  TestDriven.net,必不可少的开发和测试工具。本示例需要用它向MongoDB中初始化测试数据。下载地址:
  http://www.testdriven.net/
  
  二,项目结构:
  麻雀虽小,五脏俱全。整个项目结构是一个最原始的三层。直接上图:
DSC0000.png
  三,技术细节:
  1,MongoDB数据库操作。
ADO.NET虽然很强大,但我们通常需要自己动手写一个SqlHelper。MongoDB也一样,我们仍有必要在驱动的基础上对常用的数据操作进行封装。下面贴出本鸟写的MongoDB数据库操作类。大多数方法都与数据查询相关。贴出主要代码:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;
using MongoDB;
using MongoDB.Linq;
using Mcmurphy.Commons.Enumerations;
namespace Mcmurphy.DAL
{
public class MongoDBHelper
{
#region 基本信息
private static readonly string ConnectionString;
private static readonly string DatabaseName;
///
/// 当前Mongo引用
///
private static Mongo mongo;
///
/// 初始化数据库配置
///
static MongoDBHelper()
{
ConnectionString = ConfigurationManager.AppSettings["connString"];
DatabaseName = ConfigurationManager.AppSettings["currentDB"];
}
///
/// 当前Mongo对象
///
private static Mongo CurrentMongo
{
get
{
return new Mongo(ConnectionString);
}
}
///
/// 当前操作集合
///
private static IMongoCollection GetCollection() where T:class
{
try
{
mongo = CurrentMongo;
mongo.Connect();
IMongoDatabase db = GetCurrentDataBase();
IMongoCollection collection = db.GetCollection();
return collection;
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 获取当前Mongo数据库对象
///
/// 当前Mongo数据库对象
private static IMongoDatabase GetCurrentDataBase()
{
return mongo.GetDatabase(DatabaseName);
}
#endregion
#region 数据查询
///
/// 获取排序规则
///
private static IndexOrder GetIndexOrder(DataOrder order)
{
IndexOrder @orderby = order == DataOrder.Ascending ?
IndexOrder.Ascending : IndexOrder.Descending;
return orderby;
}
///
/// 根据条件进行查询,并进行分页
///
/// 类型参数
/// 条件Lamda表达式
/// 当前页索引
/// 分页大小
/// 结果集
public static IEnumerable GetBySearch(System.Linq.Expressions.Expression selector, int pageIndex, int pageSize) where T : class
{
try
{
var currentCollection = GetCollection();
return currentCollection.Find(selector).Skip((pageIndex - 1) * pageSize).Limit(pageSize).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
///
/// 根据条件进行查询,并进行分页和排序
///
/// 类型参数
/// 条件Lamda表达式
/// 当前页索引
/// 分页大小
/// 排序规则
/// 排序字段
/// 结果集
public static IEnumerable GetBySearch(System.Linq.Expressions.Expression selector, int pageIndex, int pageSize, DataOrder order, string orderField) where T : class
{
try
{
IndexOrder orderby = GetIndexOrder(order);
var currentCollection = GetCollection();
return currentCollection.Find(selector).Sort(orderField, orderby).Skip((pageIndex - 1) * pageSize).Limit(pageSize).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
///
/// 根据条件查询一个对象
///
/// 类型参数
/// 查询条件Lamda表达式
/// 查询对象
public static T GetOneBySearch(System.Linq.Expressions.Expression selector) where T : class
{
try
{
var currentCollection = GetCollection();
return currentCollection.FindOne(selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
///
/// 根据查询条件获取总记录数
///
/// 类型参数
/// 查询条件
/// 记录数
public static long GetTotalCount(System.Linq.Expressions.Expression selector) where T : class
{
try
{
var currentCollection = GetCollection();
return currentCollection.Count(selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
///
/// 获取总记录数
///
/// 类型参数
/// 记录数
public static long GetTotalCount() where T : class
{
try
{
var currentCollection = GetCollection();
return currentCollection.Count();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
#endregion
#region 数据插入
///
/// 数据插入
///
/// 类型参数
/// 要插入的数据对象
public static void Insert(T t) where T : class
{
try
{
var currentCollection = GetCollection();
currentCollection.Insert(t);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}                     
}
#endregion
#region 数据更新
///
/// 根据查询条件更新数据
///
/// 类型参数
/// 待更新的对象
/// 更新的条件Lamda表达式
public static void Update(T t, System.Linq.Expressions.Expression selector) where T : class
{
try
{
var currentCollection = GetCollection();
currentCollection.Update(t,selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
///
/// 更新/插入数据(id是否存在)
///
/// 类型参数
/// 待更新的对象
public static void Update(T t) where T : class
{
try
{
var currentCollection = GetCollection();
//inserts of updates depends on whether id exists
currentCollection.Save(t);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
#endregion
#region 数据删除
///
/// 数据删除
///
/// 类型参数
/// 查询的条件Lamda表达式
public static void Delete(System.Linq.Expressions.Expression selector) where T : class
{
try
{
var currentCollection = GetCollection();
currentCollection.Remove(selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
#endregion
}
}
  初次调用的时候,会读取在站点项目下Web.Config文件中配置的数据库服务器地址以及数据库名称。
  
  2,Flexgrid加载的数据格式。
在官网上徘徊了很久也没有找到Flexgrid要求的数据格式说明。还好有Firebug,但遗憾的是官方示例采用的是XML格式。如下:




  1
  234
  
    
    ...
  
  ...

  上述XML存在一个问题,就是具体的列并没有id标识。也就是说,在配置Flexgrid的时候,你必须了解服务器返回的数据字段的顺序。否则就会出现“标题列显示回复数”的情况。在数据格式为Json的时候,也会出现同样的状况。理想情况下,官方应该给出的XML数据格式如下:




  1
  234
  
    
    ...
  
  ...

  对于本示例采用的Json,经测试,完整的数据格式如下:



{
  "page":当前页,
  "total":总记录数,
  "rows":[
    {
      "id":当前行编号,
      "cell":{
        "username":"mcmurphy",
        "password":"mcmurphy",
        ...
      }
    }
    ...
  ]
}
  Flexgrid官方文档的欠缺和一个无意的疏忽,相信一定误导了不少人,也导致本鸟走了不少弯路。
  对于服务器向客户端输出Json,使用了Newtonsoft.Json这个第三方组件,有兴趣的朋友可以百度一下。
当然,在System.Web.Script.Serialization命名空间下,有一个JavaScriptSerializer类,也可以对Json进行序列化与反序列化的操作。
  
  3,LINQ的动态组合查询。
  LINQ虽然给我们提供了很多方便,但在多条件组合查询方面,显然没有传统的拼接SQL来得直观和爽快。网上流传的很多解决方案,代码一坨一坨的,看了都头痛,而且基本都是抄来抄去。后来找到杨过前辈的一篇,比较有参考价值:
  http://www.iyunv.com/yjmyzz/archive/2008/03/25/1122135.html
  主要借助了老外写的一个扩展表达式,代码如下:



using System;
using System.Linq;
using System.Linq.Expressions;
namespace Mcmurphy.DAL
{
///
/// 老外写的,非常厉害
///
public static class PredicateExtensions
{
public static Expression True() { return f => true; }
public static Expression False() { return f => false; }
public static Expression Or(this Expression expression1,
Expression expression2)
{
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast());
return Expression.Lambda(Expression.Or(expression1.Body, invokedExpression),
expression1.Parameters);
}
public static Expression And(this Expression expression1,
Expression expression2)
{
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast());
return Expression.Lambda(Expression.And(expression1.Body,
invokedExpression), expression1.Parameters);
}
}
}
  上述代码主要是进行逻辑运算的四个方法,代码很短,但我们不得不佩服老外的功力。
关于老外的这个扩展表达式,还有前辈写过一篇讲解:
  http://www.iyunv.com/whitewolf/archive/2010/08/02/1790390.html
  
  四,最终运行
  有图有真相:
DSC0001.png
  
  本文主要是做一个梳理和记录。示例中用到的很多技术都比较简单,当然也有很多不足之处,这对一个菜鸟来说在所难免。希望路过的高手给予最严厉的批评和指正。放心,你只要不能直接干掉我,都只会让我更加坚强。 (^o^)

  下面流出源码种子(运行前请读一下:读我.txt):源码种子

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83625-1-1.html 上篇帖子: MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 下篇帖子: Visual Studio 2010 编译 MongoDB C++ Client Driver
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表