zl程序教程

您现在的位置是:首页 >  后端

当前栏目

MongoDB入门教程之C#驱动操作实例

2023-06-13 09:19:49 时间

作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者,

因为提供了丰富的linq操作,相当方便。

官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads。下载后,还提供了一个酷似msdn的帮助文档。

samus驱动:https://github.com/samus/mongodb-csharp/downloads。

下面就具体看看samus驱动,https://github.com/samus/mongodb-csharp/blob/master/examples/Simple/Main.cs上面提供了

一个简单的demo,大体上看看我们就知道怎么玩了。

一: 实践

1:我们建立一个Person实体,MongoAlias特性表示取别名,这里的ID值将会覆盖掉数据库自动生成的_id。

#region 数据实体
  /// summary
/// 数据实体
/// /summary
  public class Person
  {
  [MongoAlias( _id )]
  public string ID { get; set; }

  public string Name { get; set; }

  public int Age { get; set; }

  public DateTime CreateTime { get; set; }
  }
  #endregion

2:初始化一些变量

string connectionString = string.Empty;

  string databaseName = string.Empty;

  string collectionName = string.Empty;

  static MongodbHelper T mongodb;

  #region 初始化操作
/// summary
/// 初始化操作
/// /summary
  public MongodbHelper()
  {
  connectionString = Server=127.0.0.1:2222
  databaseName = shopex
  collectionName = person
  }
  #endregion

3:为了方便T的继承类使用linq功能,我们还需要映射一下。

#region 实现linq查询的映射配置
  /// summary
/// 实现linq查询的映射配置
/// /summary
  public MongoConfiguration configuration
  {
  get
  {
  var config = new MongoConfigurationBuilder();

  config.Mapping(mapping =
  {
  mapping.DefaultProfile(profile =
  {
  profile.SubClassesAre(t = t.IsSubclassOf(typeof(T)));
  });
  mapping.Map T
  mapping.Map T
  });

  config.ConnectionString(connectionString);

  return config.BuildConfiguration();
  }
  }
  #endregion

4:下面是一些基本的CURD的代码,跟写EF代码很类似,写起来好舒服。

#region 插入操作
  /// summary
/// 插入操作
/// /summary
/// param name= person /param
/// returns /returns
  public void Insert(T t)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  collection.Insert(t, true);

  mongo.Disconnect();

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 更新操作
  /// summary
/// 更新操作
/// /summary
/// param name= person /param
/// returns /returns
  public void Update(T t, Expression Func T, bool func)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  collection.Update T (t, func, true);

  mongo.Disconnect();

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 获取集合
  /// summary
///获取集合
/// /summary
/// param name= person /param
/// returns /returns
  public List T List(int pageIndex, int pageSize, Expression Func T, bool func, out int pageCount)
  {
  pageCount = 0;

  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  pageCount = Convert.ToInt32(collection.Count());

  var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex 1))
  .Take(pageSize).Select(i = i).ToList();

  mongo.Disconnect();

  return personList;

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 读取单条记录
  /// summary
///读取单条记录
/// /summary
/// param name= person /param
/// returns /returns
  public T Single(Expression Func T, bool func)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  var single = collection.Linq().FirstOrDefault(func);

  mongo.Disconnect();

  return single;

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 删除操作
  /// summary
/// 删除操作
/// /summary
/// param name= person /param
/// returns /returns
  public void Delete(Expression Func T, bool func)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  //这个地方要注意,一定要加上T参数,否则会当作object类型处理
//导致删除失败
  collection.Remove T (func);

  mongo.Disconnect();

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

5.  好,我们开一下2222端口,由于前前篇我已经把这个mongodb做成了服务,现在就直接连过去了,并做一下对Name的索引。

6. 一切准备妥当,我们做下基本的操作,比如这里我添加一千条数据,注意我开启的是安全模式,如果插入不成功,将会抛出异常。

  1 Add:

 

 static void Main(string[] args)
  {
  MongodbHelper Person helper = new MongodbHelper Person

  //插入1000条数据
  for (int i = 0; i 1000; i++)
  {
  helper.Insert(new Person()
  {
  ID = Guid.NewGuid().ToString(),
  Name = jack + i,
  Age = i,
  CreateTime = DateTime.Now
  });
  }

  Console.WriteLine( 插入成功 );

  Console.Read();
  }
 

 乍一看显示的数据以为有问题,为什么没有出现jack0或者jack999,不过find的一下后心情舒坦了。

2 update:  这里就把jack941的名字改掉“mary”

static void Main(string[] args)
  {
  MongodbHelper Person helper = new MongodbHelper Person

  //修改jack941改成mary
  var single = helper.Single(i = i.Name == jack941 );
  single.Name = mary
  helper.Update(single, i = i.ID == single.ID);

  Console.WriteLine( 修改成功 );
  Console.Read();
  }

3 Delete:  删除mary这条记录

static void Main(string[] args)
  {
  MongodbHelper Person helper = new MongodbHelper Person

  //删除mary这个记录
  helper.Delete(i = i.Name == mary );

  Console.WriteLine( 删除成功 );
  Console.Read();
  }

4 list操作: 这里我获取一下名字里面带9的人数列表

static void Main(string[] args)
  {
  MongodbHelper Person helper = new MongodbHelper Person

  int pagecount;

  //获取名字里面带9的人数
  var list = helper.List(1, 20, i = i.Name.Contains( 9 ), out pagecount);

  Console.Read();
  }

总的运行代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Linq.Expressions;

using MongoDB.Configuration;
using MongoDB.Linq;
using MongoDB.Attributes;

namespace MongoDB.Test
{
  public class MongodbHelper T where T : class
  {
  string connectionString = string.Empty;

  string databaseName = string.Empty;

  string collectionName = string.Empty;

  static MongodbHelper T mongodb;

  #region 初始化操作
  /// summary
/// 初始化操作
/// /summary
  public MongodbHelper()
  {
  connectionString = Server=127.0.0.1:2222
  databaseName = shopex
  collectionName = person
  }
  #endregion

  #region 实现linq查询的映射配置
  /// summary
/// 实现linq查询的映射配置
/// /summary
  public MongoConfiguration configuration
  {
  get
  {
  var config = new MongoConfigurationBuilder();

  config.Mapping(mapping =
  {
  mapping.DefaultProfile(profile =
  {
  profile.SubClassesAre(t = t.IsSubclassOf(typeof(T)));
  });
  mapping.Map T
  mapping.Map T
  });

  config.ConnectionString(connectionString);

  return config.BuildConfiguration();
  }
  }
  #endregion

  #region 插入操作
  /// summary
/// 插入操作
/// /summary
/// param name= person /param
/// returns /returns
  public void Insert(T t)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  collection.Insert(t, true);

  mongo.Disconnect();

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 更新操作
  /// summary
/// 更新操作
/// /summary
/// param name= person /param
/// returns /returns
  public void Update(T t, Expression Func T, bool func)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  collection.Update T (t, func, true);

  mongo.Disconnect();

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 获取集合
  /// summary
///获取集合
/// /summary
/// param name= person /param
/// returns /returns
  public List T List(int pageIndex, int pageSize, Expression Func T, bool func, out int pageCount)
  {
  pageCount = 0;

  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  pageCount = Convert.ToInt32(collection.Count());

  var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex 1))
  .Take(pageSize).Select(i = i).ToList();

  mongo.Disconnect();

  return personList;

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 读取单条记录
  /// summary
///读取单条记录
/// /summary
/// param name= person /param
/// returns /returns
  public T Single(Expression Func T, bool func)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  var single = collection.Linq().FirstOrDefault(func);

  mongo.Disconnect();

  return single;

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion

  #region 删除操作
  /// summary
/// 删除操作
/// /summary
/// param name= person /param
/// returns /returns
  public void Delete(Expression Func T, bool func)
  {
  using (Mongo mongo = new Mongo(configuration))
  {
  try
  {
  mongo.Connect();

  var db = mongo.GetDatabase(databaseName);

  var collection = db.GetCollection T (collectionName);

  //这个地方要注意,一定要加上T参数,否则会当作object类型处理
//导致删除失败
  collection.Remove T (func);

  mongo.Disconnect();

  }
  catch (Exception)
  {
  mongo.Disconnect();
  throw;
  }
  }
  }
  #endregion
  }

  #region 数据实体
  /// summary
/// 数据实体
/// /summary
  public class Person
  {
  [MongoAlias( _id )]
  public string ID { get; set; }

  public string Name { get; set; }

  public int Age { get; set; }

  public DateTime CreateTime { get; set; }
  }
  #endregion

我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题

本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 MongoDB入门教程之C#驱动操作实例