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

[经验分享] MongoDB简单实践:Only CRUD

[复制链接]

尚未签到

发表于 2015-7-6 10:08:35 | 显示全部楼层 |阅读模式
  断断续续写了个关于MongoDB的简单示例,涉及到了基础的CRUD。实践的过程中,发现不少问题,尤其是新旧版本的C#驱动类库变动较大,所以有一些明显的问题自己还是摸不着头脑,记录下来,期待您的指点。

一、开发环境搭建
  这个不用多废话了,可以搜索一下,有很多文章已经介绍了如何搭建开发环境。如果您想亲自尝试一下,参考官方文档的这一篇,按照说明一步一步自己在本地配置一个可开发MongoDB应用程序的windows环境。当然了,如果您的环境不是windows,可以选择这里的文档,对照设置即可。

二、实体类说明
  在demo中,您可以看到一个简单的实体类Book,其中包含四个属性:

using System;
namespace SimpleMongoDBApp
{
using MongoDB.Bson;
[Serializable]
public class Book
{
public Book()
{
}
public Book(string author, string title, DateTime createDate)
{
this.Author = author;
this.Title = title;
this.CreateDate = createDate;
}
public string Author { get; set; }
public string Title { get; set; }
public DateTime CreateDate { get; set; }

///
/// 主键
///
public ObjectId Id
{
get;
set;
}
}
}
  需要您注意的是主键Id属性的类型是ObjectId。在增删改查中,这个Id的作用是非常重要的。

三、简单的CRUD
  老实说,这没什么可说的,只是简单类库调用而已,但是实践的时候还是有一些小意外,感觉和文档说明的不一致。这里的示例主要是参考这一篇而成的。

1、增删改
  这三个相对容易一些,对照文档说明,调用对应的几个方法,即可完成增删改的操作。比如对于简单的更新方法:

  public void Update(Book query, Book dest)
{
string connectionString = Config.GetCurrentMongoDBConnString();
MongoServer server = MongoServer.Create(connectionString);
MongoDatabase database = server.GetDatabase(Config.CurrentDBName);
using (server.RequestStart(database))
{
MongoCollection books = database.GetCollection(Config.CurrentTbName);
QueryDocument condition = new QueryDocument("_id", query.Id);//按照id更新
Book book = books.FindOne(condition);
if (book != null)
{
dest.Id = query.Id;
books.Save(dest);
}
}
}

  这里我使用的是Save函数,我们也可以调用文档说明中的Update方法,最终效果其实是一样的。

2、分页查询
  和关系型数据库一样,查询也可以分很多种,比如精确匹配,范围查询,模糊匹配,分组查询等等。本文的示例只是进行了简单的按字段精确匹配,是最简单的一种查询。好在现在的类库都有对应的查询方法,您可以自己尝试不同种类的复杂查询试试看。对于简单的查询直接调用相关Find方法即可,分页查询我们通常通过SetSkip和SetLimit配合使用返回查询结果:

        ///
/// 分页查询
///
public IList Select(int currentPage, int recordsPerPage, Book query)
{
List listResult = new List();
string connectionString = Config.GetCurrentMongoDBConnString();
MongoServer server = MongoServer.Create(connectionString);
MongoDatabase database = server.GetDatabase(Config.CurrentDBName);
MongoCollection books = database.GetCollection(Config.CurrentTbName);
QueryComplete condition = Query.And(Query.EQ("Title", query.Title));//有查询结果
//QueryComplete condition = Query.And(Query.EQ("Author", query.Author));//无查询结果
//QueryComplete condition = Query.And(Query.EQ("Title", query.Title), Query.EQ("Author", query.Author));//无查询结果
MongoCursor cursors = books.Find(condition).SetSkip((currentPage - 1) * recordsPerPage).SetLimit(recordsPerPage);// books.Find(condition);
//MongoCursor cursors = books.FindAs(condition).SetSkip((currentPage - 1) * recordsPerPage).SetLimit(recordsPerPage);// books.Find(condition);
//MongoCursor cursors = books.FindAll().SetSkip((currentPage - 1) * recordsPerPage).SetLimit(recordsPerPage);// books.Find(condition);
listResult.AddRange(cursors);
return listResult;
}

  实践的时候我发现一个问题,就是在尝试按照Author属性进行查询的时候,一条记录没有(实际匹配结果应该不止一条,而且比按照Title查询的匹配结果更多),但是按照Title数据又可以查询出结果,对照文档查找良久,没有找到原因,莫非又是….传说中的rp问题?郁闷。

四、老赵的EasyMongo
  对于MongDB的其他相关方法,可以参考官方说明文档,类库已经非常丰富。到这里您可能已经发现了一个问题,就是我在调用MongoDB相关类库方法的时候,重复的代码较多,比如下面这一段:

          string connectionString = Config.GetCurrentMongoDBConnString();
MongoServer server = MongoServer.Create(connectionString);
MongoDatabase database = server.GetDatabase(Config.CurrentDBName);
using (server.RequestStart(database))
{
//some code here
}
  就出现不少次,那什么,大家当然想到要重构,要使用ORM,要更优雅地调用……等等等等。我当然已经发现程序中的问题,本来想自己再封装一层的,让调用更简洁舒服一些,但是自从看到了老赵的EasyMongo(原来这么强大实用的东西牛人早帮我们做好了,看了一下源码,感觉和他之前的FastReflection差不多复杂,我承认自己真的写不出来),还是直接推荐使用了吧。
  最后介绍一个国内非常好的NoSQL学习资源:
  http://blog.nosqlfan.com/
  demo下载:MongoDBApp

运维网声明 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-83735-1-1.html 上篇帖子: MongoDB查询语法 下篇帖子: mongodb高级操作及在Java企业级开发中的应用.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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