MongoDB简单实践:Only CRUD

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

断断续续写了个关于MongoDB的简单示例,涉及到了基础的CRUD。实践的过程中,发现不少问题,尤其是新旧版本的C#驱动类库变动较大,所以有一些明显的问题自己还是摸不着头脑,记录下来,期待您的指点。

一、开发环境搭建

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

二、实体类说明

在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差不多复杂,我承认自己真的写不出来),还是直接推荐使用了吧。

最后介绍一个国内非常好的NoSQL学习资源:

http://blog.nosqlfan.com/

demo下载:MongoDBApp






本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2011/04/05/2006029.html,如需转载请自行联系原作者


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
1月前
|
NoSQL Java MongoDB
Springboot WebFlux项目结合mongodb进行crud
这篇文章介绍了如何使用Spring Boot WebFlux框架结合MongoDB进行基本的CRUD(创建、读取、更新、删除)操作,包括项目设置、实体类和Repository的创建、控制器的实现以及配置文件的编写。
42 0
Springboot WebFlux项目结合mongodb进行crud
|
13天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
14天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
2月前
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
30 6
|
6月前
|
NoSQL Java MongoDB
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
【5月更文挑战第11天】本文介绍了如何将非关系型数据库MongoDB与Spring Boot框架集成,以实现高效灵活的数据管理。Spring Boot简化了Spring应用的构建和部署,MongoDB则以其对灵活数据结构的处理能力受到青睐。集成步骤包括:添加MongoDB依赖、配置连接信息、创建数据访问对象(DAO)以及进行数据操作。通过这种方式,开发者可以充分利用两者优势,应对各种数据需求。在实际应用中,结合微服务架构等技术,可以构建高性能、可扩展的系统。掌握MongoDB与Spring Boot集成对于提升开发效率和项目质量至关重要,未来有望在更多领域得到广泛应用。
231 3
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
|
5月前
|
存储 NoSQL 数据处理
探索MongoDB:灵活、高性能的NoSQL数据库解决方案与应用实践
探索MongoDB:灵活、高性能的NoSQL数据库解决方案与应用实践
300 1
|
6月前
|
NoSQL 安全 MongoDB
【MongoDB 专栏】MongoDB 的安全性考虑与实践
【5月更文挑战第11天】在数字化时代,MongoDB的数据安全至关重要。面临网络攻击、内部威胁、数据泄露和未授权访问等风险,我们需要重视MongoDB的安全性。关键措施包括身份验证和授权、数据加密、网络安全、备份和恢复、安全审计及正确配置。实践中应启用身份验证,配置访问控制,加密敏感数据,加强网络安全,并定期备份和审计。保持软件更新,结合业务需求制定安全策略,以确保数据的保密性、完整性和可用性。
171 0
【MongoDB 专栏】MongoDB 的安全性考虑与实践
|
6月前
|
NoSQL MongoDB 数据库
|
6月前
|
NoSQL 搜索推荐 算法
【MongoDB】MongoDB在推荐系统中的实践应用
【4月更文挑战第1天】【MongoDB】MongoDB在推荐系统中的实践应用
|
6月前
|
NoSQL MongoDB 数据库
MongoDB黑窗口操作(CRUD)
MongoDB黑窗口操作(CRUD)