MongoDB提供的C#驱动

📅 2026/7/5 4:06:07
MongoDB提供的C#驱动
我把MongoDB提供的C#驱动中认为比较重要的类做了个截图再来看看我前面给出一段操作MongoDB的代码// 首先创建一个连接 using( Mongo mongo new Mongo(_connectionString) ) { // 打开连接 mongo.Connect(); // 切换到指定的数据库 var db mongo.GetDatabase(_dbName); // 根据类型获取相应的集合 var collection db.GetCollectionCustomer(); // 【访问collection做你想做的操作】 }这段代码大致也说明了在C#中操作MongoDB的一个过程主要涉及上图中的前三个类这三个类也是最核心的类。 这里值得一提的是LinqExtensions.Linq()方法可以让我们在写查询时 方便地使用LINQ的优雅语法而不是一堆复杂的文档条件这也是我选择这个驱动的原因。还记得我前面举过几个在命令行中调用runCommand的示例吗如果在C#中也需要执行这样的操作可以调用MongoDatabase.SendCommand() 方法。比如删除集合Category我们可以写成void DeleteCategoryCollection() { using( MyMongoDb mm new MyMongoDb() ) { mm.CurrentDb.SendCommand(new Document(drop, Category)); } }【MongoIdAttribute】可以让我们将一个C#类的数据成员映射到文档的_id属性。前面有示例说明这里就不再多说了。【MongoAliasAttribute】可以让我们将一个C#类的数据成员在映射到文档时采用其它的属性名称。比如我希望将CustomerName成员在保存到MongoDB时采用CName来保存。[MongoAlias(CName)] public string CustomerName { get; set; }【MongoIgnoreAttribute】可以让一个C#类在保存到MongoDB时忽略某些成员。请看下面的代码public sealed class OrderItem : MyDataItem { [MongoId] // 这个成员将映射到 _id public string OrderID { get; set; } [ScriptIgnore] // 在JSON序列化时忽略这个成员 public DateTime OrderDate { get; set; } [MongoIgnore] // 在保存到MongoDB时忽略这个成员 public string CustomerName { get; set; } // .... 还有其它的属性。 // 加这个属性仅仅为了在客户端中能更容易的显示要不然客户端处理格式转换实在是麻烦。 // 它将不会被写入到数据库。 [MongoIgnore] public string OrderDateText { get { return this.OrderDate.ToString(yyyy-MM-dd HH:mm:ss); } } }回到顶部MongoDB不支持在查询数据库时使用Join操作在MongoDB中一个文档就是一个完整的对象所以获取一个对象时并不需要关系数据库的那种JOIN语法。 在上面定义的OrderItem中CustomerName并没有保存到数据库而是在加载时采用了【引用】的设计方式 根据CustomerID去访问集合Customer来获取对应的CustomerName 这也算是JOIN的常见使用场景了。示例项目中有一个需求根据一个日期范围查询订单列表支持分页。我是这样实现这个查询操作的。/// summary /// 根据指定的查询日期范围及分页参数获取订单记录列表 /// /summary /// param namedateRange日期范围/param /// param namepagingInfo分页参数/param /// returns订单记录列表/returns public ListOrderItem Search(QueryDateRange dateRange, PagingInfo pagingInfo) { dateRange.EndDate dateRange.EndDate.AddDays(1); using( MyMongoDb mm new MyMongoDb() ) { var collection mm.GetCollectionOrderItem(STR_Orders); var query from ord in collection.Linq() where ord.OrderDate dateRange.StartDate ord.OrderDate dateRange.EndDate orderby ord.OrderDate descending select new OrderItem { OrderID ord.OrderID, CustomerID ord.CustomerID, OrderDate ord.OrderDate, SumMoney ord.SumMoney, Finished ord.Finished }; // 获取订单列表此时将返回符合分页的结果。 ListOrderItem list query.GetPagingListOrderItem(pagingInfo); // 获取订单列表中所有的客户ID string[] cids (from ord in list where string.IsNullOrEmpty(ord.CustomerID) false select ord.CustomerID) .Distinct() .ToArray(); // 找到所有客户记录 Dictionarystring, Customer customers (from c in mm.GetCollectionCustomer().Linq() where cids.Contains(c.CustomerID) select new Customer { CustomerID c.CustomerID, CustomerName c.CustomerName }) .ToDictionary(x x.CustomerID); // 为订单列表结果设置CustomerName foreach( OrderItem ord in list ) { Customer c null; if( string.IsNullOrEmpty(ord.CustomerID) false customers.TryGetValue(ord.CustomerID, out c) ) ord.CustomerName c.CustomerName; else ord.CustomerName string.Empty; } return list; } }