先 NuGet两个程序集 1:MongoDB.Driver、   2:MongoDB.Bson

namespace ConsoleApp1
{
/// <summary>
/// MongoDb帮助类
/// </summary>
/// <summary>
/// MongoDb帮助类
/// </summary>
public class DB
{
private static readonly string connStr = "mongodb://127.0.0.1:27017";//GlobalConfig.Settings["mongoConnStr"];

private static readonly string dbName = "school";//GlobalConfig.Settings["mongoDbName"];

private static IMongoDatabase db = null;

private static readonly object lockHelper = new object();

private DB() { }

public static IMongoDatabase GetDb()
{
if (db == null)
{
lock (lockHelper)
{
if (db == null)
{
var client = new MongoClient(connStr);
db = client.GetDatabase(dbName);
}
}
}
return db;
}
}

public class MongoDbHelper<T>
{
private IMongoDatabase db = null;

private IMongoCollection<T> collection = null;

public MongoDbHelper()
{
this.db = DB.GetDb();
collection = db.GetCollection<T>(typeof(T).Name);
}
/// <summary>
/// 新增
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public T Insert(T entity)
{
var flag = ObjectId.GenerateNewId();
entity.GetType().GetProperty("_id").SetValue(entity, flag);
collection.InsertOneAsync(entity);
return entity;
}

/// <summary>
/// 修改一个值
/// </summary>
/// <param name="express"></param>
/// <param name="field"></param>
/// <param name="value"></param>
public bool Modify(Expression<Func<T, bool>> express, object updateField)
{
if (updateField == null) return false;

var props = updateField.GetType().GetProperties();
var field = props[0].Name;
var value = props[0].GetValue(updateField);
var updated = Builders<T>.Update.Set(field, value);

UpdateResult result = collection.UpdateOneAsync(express, updated).Result;
return result.ModifiedCount > 0 ? true : false;
}

/// <summary>
/// 更新
/// </summary>
/// <param name="entity"></param>
public bool Update(Expression<Func<T, bool>> express, T entity)
{
try
{
var old = collection.Find(express).ToList().FirstOrDefault();

foreach (var prop in entity.GetType().GetProperties())
{
if (!prop.Name.Equals("_id"))
{
var newValue = prop.GetValue(entity);
var oldValue = old.GetType().GetProperty(prop.Name).GetValue(old);

if (newValue != null)
{
if (oldValue == null)
oldValue = "";
if (!newValue.ToString().Equals(oldValue.ToString()))
{
old.GetType().GetProperty(prop.Name).SetValue(old, newValue.ToString());
}
}
}
}

// var filter = Builders<T>.Filter.Eq("Id", entity.Id);
ReplaceOneResult result = collection.ReplaceOneAsync(express, old).Result;
if (result.ModifiedCount > 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
var aaa = ex.Message + ex.StackTrace;
throw;
}
}

/// <summary>
/// 删除
/// </summary>
/// <param name="entity"></param>
public bool Delete(Expression<Func<T, bool>> express)
{
DeleteResult result = collection.DeleteOneAsync(express).Result;
return result.DeletedCount > 0 ? true : false;
}

/// <summary>
/// 查询条件查询数据
/// </summary>
/// <returns></returns>
public List<T> QueryAll(Expression<Func<T, bool>> express)
{
return collection.Find(express).ToList();
}

/// <summary>
/// 根据条件查询一条数据
/// </summary>
/// <param name="express"></param>
/// <returns></returns>
public T QueryByFirst(Expression<Func<T, bool>> express)
{
return collection.Find(express).ToList().FirstOrDefault();
}

/// <summary>
/// 批量添加
/// </summary>
/// <param name="list"></param>
public void InsertBatch(List<T> list)
{
collection.InsertManyAsync(list);
}

/// <summary>
/// 根据Id批量删除
/// </summary>
public bool DeleteBatch(List<ObjectId> list)
{
var filter = Builders<T>.Filter.In("_id", list);
DeleteResult result = collection.DeleteManyAsync(filter).Result;
return result.DeletedCount > 0 ? true : false;
}

}

}

C#/.Net操作MongoDBHelper类的更多相关文章

  1. XML格式示例 与 XML操作(读取)类封装

    header('Content-Type: text/xml'); <?xml version="1.0" encoding="utf-8" standa ...

  2. 简洁的PHP操作SQLite类

    SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了. ...

  3. C#工具类:Json操作帮助类(转载)

    原文转载自C#工具类:Json操作帮助类_IT技术小趣屋. Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来 ...

  4. 【转载】C#工具类:Json操作帮助类

    Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来简化相应的操作,该工具类中包含以下功能:对象转JSON.数据 ...

  5. 【转载】微软官方提供的Sqlserver数据库操作帮助类SQLHelper类

    在.NET平台中,C#语言一般使用ADO.NET组件来操作Sqlserver数据库,通过ADO.NET组件可以实现连接数据库.查询数据集.执行SQL语句以及关闭数据库连接等操作,为此网上有很多开发者自 ...

  6. oracleHelper 操作帮助类

    using System; using System.Configuration; using System.Data; using System.Collections; using Oracle. ...

  7. Java反射机制demo(六)—获得并操作一个类的属性

    Java反射机制demo(六)—获得并操作一个类的属性 获得并操作一个类的属性?! 不可思议啊,一个类的属性一般都是私有成员变量啊,private修饰符啊! 但是毫无疑问,这些东西在Java的反射机制 ...

  8. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  9. 五 Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

随机推荐

  1. Linux下用火焰图进行性能分析【转】

    转自:https://blog.csdn.net/gatieme/article/details/78885908 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  2. kolla部署openstack allinone,报错APIError: 500 Server Error: Internal Server Error (\"oci runtime error: container_linux.go:235: starting container process caused \"container init exited prematurely

    使用 kolla-ansible 部署 opnenstack:stein 执行 kolla-ansible -i ./all-in-one deploy 开始自动化部署 在部署过程中报错,报错信息如下 ...

  3. Ubuntu下使用linuxdeployqt打包Qt程序

    写了点Qt界面程序,然而发现很难移植到其他没有安装Qt环境的电脑上运行.查资料了解到,在windows上有windeployqt程序,linux上有linuxdeployqt可以帮助我们快速打包. 1 ...

  4. 201871010132--张潇潇--《面向对象程序设计(java)》第十五周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  5. 怎么删掉xampp文件夹

    删掉xampp文件夹时,提示:操作无法完成,因为其中的文件夹或文件已在另一程序中打开 具体的解决方法: 菜单栏输入:服务 找到apachezt和mysqlzt,并禁用    -- 因为之前打开Zent ...

  6. 创建war类型项目(六)

    1. 创建maven project时选择packaging为war: 2. 在webapp文件夹下新建META-INF和WEB-INF/web.xml web.xml模板 <?xml vers ...

  7. spark 配置

    1. mv slaves.template slaves slaves 文件添加 hadoop.slave01 hadoop.slave02 hadoop.slave03 2. cp spark-en ...

  8. dl-google.com 的问题

    印象里,如果用过公司vpn之后,再用android studio, 这个地址就能被解析下载了. 看来,应该只是域名被屏蔽,ip并没有. 所以,以后拿到ip之后,写进hosts里应该没事 https:/ ...

  9. Apex 小知识:SOQL 在循环中的应用

    两种在循环中引用 SOQL 的方法 第一种方法: List<Account> accounts = [SELECT Id FROM Account WHERE NumberOfEmploy ...

  10. nginx配置文件结构及location块语法规则

    一. nginx配置文件结构介绍 二. location语法规则: 用法示例: location [=|~|~*|^~] /uri/ { … } # 讲解如下: 1.  = 开头表示精确匹配 2.  ...