查看: 3019|回复: 0

MongoDB简单实践:Only CRUD

[复制链接]
论坛徽章:
65
生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05生肖徽章2007版:龙
日期:2012-04-26 14:03:05蓝锆石
日期:2012-04-26 13:39:45开发板块每日发贴之星
日期:2012-04-26 14:03:05ERP板块每日发贴之星
日期:2012-04-26 14:03:05行业板块每日发贴之星
日期:2012-04-26 14:03:05
跳转到指定楼层
1#
发表于 2012-2-28 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
断断续续写了个关于MongoDB的简单示例,涉及到了基础的CRUD。实践的过程中,发现不少问题,尤其是新旧版本的C#驱动类库变动较大,所以有一些明显的问题自己还是摸不着头脑,记录下来,期待您的指点。
一、开发环境搭建这个不用多废话了,可以搜索一下,有很多文章已经介绍了如何搭建开发环境。
二、实体类说明在demo中,您可以看到一个简单的实体类Book,其中包含四个属性:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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; }


        /// <summary>
        /// 主键
        /// </summary>
        public ObjectId Id
        {
            get;
            set;
        }
    }
}



需要您注意的是主键Id属性的类型是ObjectId。在增删改查中,这个Id的作用是非常重要的。
三、简单的CRUD老实说,这没什么可说的,只是简单类库调用而已,但是实践的时候还是有一些小意外,感觉和文档说明的不一致。这里的示例主要是参考这一篇而成的。
1、增删改这三个相对容易一些,对照文档说明,调用对应的几个方法,即可完成增删改的操作。比如对于简单的更新方法:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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<Book> books = database.GetCollection<Book>(Config.CurrentTbName);
              QueryDocument condition = new QueryDocument("_id", query.Id);//按照id更新
              Book book = books.FindOne(condition);
              if (book != null)
              {
                  dest.Id = query.Id;
                  books.Save<Book>(dest);
              }
          }
  }



这里我使用的是Save函数,我们也可以调用文档说明中的Update方法,最终效果其实是一样的。
2、分页查询和关系型数据库一样,查询也可以分很多种,比如精确匹配,范围查询,模糊匹配,分组查询等等。本文的示例只是进行了简单的按字段精确匹配,是最简单的一种查询。好在现在的类库都有对应的查询方法,您可以自己尝试不同种类的复杂查询试试看。对于简单的查询直接调用相关Find方法即可,分页查询我们通常通过SetSkip和SetLimit配合使用返回查询结果:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// <summary>
/// 分页查询
/// </summary>
public IList<Book> Select(int currentPage, int recordsPerPage, Book query)
{
    List<Book> listResult = new List<Book>();
    string connectionString = Config.GetCurrentMongoDBConnString();
    MongoServer server = MongoServer.Create(connectionString);
    MongoDatabase database = server.GetDatabase(Config.CurrentDBName);
    MongoCollection<Book> books = database.GetCollection<Book>(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<Book> cursors = books.Find(condition).SetSkip((currentPage - 1) * recordsPerPage).SetLimit(recordsPerPage);// books.Find(condition);
   
    //MongoCursor<Book> cursors = books.FindAs<Book>(condition).SetSkip((currentPage - 1) * recordsPerPage).SetLimit(recordsPerPage);// books.Find(condition);

    //MongoCursor<Book> cursors = books.FindAll().SetSkip((currentPage - 1) * recordsPerPage).SetLimit(recordsPerPage);// books.Find(condition);
   
    listResult.AddRange(cursors);
    return listResult;
}



实践的时候我发现一个问题,就是在尝试按照Author属性进行查询的时候,一条记录没有(实际匹配结果应该不止一条,而且比按照Title查询的匹配结果更多),但是按照Title数据又可以查询出结果,对照文档查找良久,没有找到原因,莫非又是….传说中的rp问题?郁闷。
四、老赵的EasyMongo对于MongDB的其他相关方法,可以参考官方说明文档,类库已经非常丰富。到这里您可能已经发现了一个问题,就是我在调用MongoDB相关类库方法的时候,重复的代码较多,比如下面这一段:
?
1
2
3
4
5
6
7
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差不多复杂,我承认自己真的写不出来),还是直接推荐使用了吧。

注:此文章来源于http://www.cnblogs.com/jeffwongi ... /04/05/2006029.html

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表