MongoDB简单实践:Only CRUD
断断续续写了个关于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学习资源:
demo下载:MongoDBApp
作者:Jeff Wong
出处:http://jeffwongishandsome.cnblogs.com/
本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2009-04-05 sql查询复习笔记-小技巧,大智慧