MongoDB基础入门003--使用官方驱动操作mongo,C#

摘要:
本文首先介绍如何使用官方驱动程序来操作MongoDB。至于MongoDB的原生添加、删除、修改和查询语句,我们稍后会慢慢学习。每个使用VS开发的人都知道,我们强大的VS有一个软件包管理工具,使用起来非常方便。现在让我们介绍一下如何使用nuget安装MongoDB驱动程序。打开nuget,输入mongo,然后安装MongoDB。驱动程序,Mongocsharpdriver。

本篇先简单介绍一下,使用官方驱动来操作MongoDB。至于MongoDB原生的增删改查语句,且等以后再慢慢学习。

一、操作MongoDB的驱动主要有两个

  1.官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads,更新的还是比较及时的,目前已经支持大部门linq语法。

  2.samus驱动:https://github.com/samus/mongodb-csharp/downloads。 这个好像很久都没有更新了,估计是被抛弃了吧。(ps:据说之前使用起来很是nb啊)

驱动的下载:一种方法是,直接使用上面的连接下载。使用vs开发的同学都懂,我们强大的vs有个软件包管理工具(nuget),使用起来非常舒服。现在就介绍如何使用nuget,来安装MongoDB的驱动程序吧。

打开nuget,输入mongo,安装上MongoDB.Driver,mongocsharpdriver即可。请看下图:

MongoDB基础入门003--使用官方驱动操作mongo,C#第1张

二、增删改查操作。

1.新增

MongoDB基础入门003--使用官方驱动操作mongo,C#第2张MongoDB基础入门003--使用官方驱动操作mongo,C#第3张
static void Main(string[] args)
        {
            string connectionString = "mongodb://localhost:27017";

            var client = new MongoClient(connectionString);
            var database = client.GetDatabase("local");
            var collection = database.GetCollection<person>("person");

            //批量插入1000条数据
            for (int i = 0; i < 1000; i++)
            {
                person p = new person();
                p.age = i % 10 + 1;
                p.createTime = DateTime.Now;
                p.name = "rj" + i;

                collection.InsertOne(p);
            }

            Console.ReadKey();
        }
新增1000条数据

2.查询

MongoDB基础入门003--使用官方驱动操作mongo,C#第4张MongoDB基础入门003--使用官方驱动操作mongo,C#第5张
 //根据条件取出一条
            var find1 = collection.Find(item => item.name == "rj0").FirstOrDefault();
            //取出指定页数
            var find2 = collection.AsQueryable().Skip(10).Take(10).ToList();
查询

3.修改(ps:Builders<T>是很强大的)

MongoDB基础入门003--使用官方驱动操作mongo,C#第6张MongoDB基础入门003--使用官方驱动操作mongo,C#第7张
 //修改
            var query = Builders<person>.Filter.Where(item => item.name == "rj0");

            var set = Builders<person>.Update.Set(item => item.name, "abc");

            collection.FindOneAndUpdate<person>(query, set);
View Code

4.删除

MongoDB基础入门003--使用官方驱动操作mongo,C#第8张MongoDB基础入门003--使用官方驱动操作mongo,C#第9张
collection.FindOneAndDelete(item => item.name == "abc");
View Code

三、基本的增删改查已经演示,下面上传一份整理的MongoDBHelper类。

MongoDB基础入门003--使用官方驱动操作mongo,C#第10张MongoDB基础入门003--使用官方驱动操作mongo,C#第11张
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using MongoDB.Driver.Linq;
using MongoDB.Bson;
using System.Configuration;

namespace MyMongoDB2
{
    public class MongoDBHelper
    {
        private static readonly string connectionString = "mongodb://admin:admin@localhost";// ConfigurationManager.AppSettings["mongodbServerList"];

        MongoClientSettings setting = null;
        MongoServer server = null;

        private string databaseName = "test";// string.Empty;

        private string tableName = "person";//string.Empty;

        #region 构造函数重载
        /// <summary>
        /// 默认开启
        /// </summary>
        public MongoDBHelper() : this(true) { }

        /// <summary>
        /// 默认副本级,指定连接串可实现单个mongodb
        /// </summary>
        public MongoDBHelper(bool replica) : this(replica, connectionString) { }

        /// <summary>
        /// 默认副本级,指定连接串可实现单个mongodb
        /// </summary>
        public MongoDBHelper(bool replica, string conn) : this(replica, conn, string.Empty, string.Empty) { }


        public MongoDBHelper(bool replica, string conn, string databasename)
                             : this(replica, conn, databasename, string.Empty)
        { }

        public MongoDBHelper(string databasename, string tablename)
                     : this(true, connectionString, databasename, tablename)
        { }

        public MongoDBHelper(string databasename)
             : this(databasename, string.Empty)
        { }

        public MongoDBHelper(bool replica, string conn, string databasename, string tablename)
        {
            //副本集
            if (replica)
            {
                var ips = conn.Split(';');

                var servicesList = new List<MongoServerAddress>();

                foreach (var ip in ips)
                {
                    var host = ip.Split(':')[0];
                    var port = Convert.ToInt32(ip.Split(':')[1]);

                    servicesList.Add(new MongoServerAddress(host, port));
                }

                setting = new MongoClientSettings()
                {
                    ReplicaSetName = "datamip",
                    Servers = servicesList
                };

                server = new MongoClient(setting).GetServer();
            }
            else
            {
                //普通的mongodb实例
                server = new MongoClient(conn).GetServer();
            }

            this.databaseName = databasename;
            this.tableName = tablename;
        }
        #endregion



        #region 删除操作 

        public bool Remove<T>(Expression<Func<T, bool>> func) => Remove<T>(databaseName, tableName, func);

        public bool Remove<T>(string table, Expression<Func<T, bool>> func) => Remove<T>(databaseName, table, func);

        public bool Remove<T>(string database, string table, Expression<Func<T, bool>> func)
        {
            try
            {
                var db = server.GetDatabase(database);

                var collection = db.GetCollection<T>(table);

                var query = Query<T>.Where(func);

                var result = collection.Remove(query);

                return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > 0;
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("Remove 失败: {0} ", ex.Message), ex);
                return false;
            }
        }


        public bool RemoveAll<T>() => RemoveAll<T>(databaseName, tableName);

        public bool RemoveAll<T>(string table) => RemoveAll<T>(databaseName, table);

        public bool RemoveAll<T>(string database, string table)
        {
            try
            {
                var db = server.GetDatabase(database);

                var collection = db.GetCollection<T>(table);

                var result = collection.RemoveAll();

                return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > 0;
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("Remove 失败: {0} ", ex.Message), ex);
                return false;
            }
        }

        #endregion



        #region 插入操作
        public bool Insert<T>(T t) => Insert<T>(databaseName, tableName, t);

        public bool Insert<T>(string table, T t) => Insert<T>(databaseName, table, t);

        public bool Insert<T>(string database, string table, T t)
        {
            try
            {
                var db = server.GetDatabase(database);   //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                var result = collection.Insert(t);

                return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > 0;
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("Insert 失败: {0} ", ex.Message), ex);
                return false;
            }
        }
        #endregion


        #region Save操作 【存在就更新,不存在就插入】
        public bool Save<T>(T t) => Save<T>(databaseName, tableName, t);

        public bool Save<T>(string table, T t) => Save<T>(databaseName, table, t);

        public bool Save<T>(string database, string table, T t)
        {
            try
            {
                var db = server.GetDatabase(database);   //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                var result = collection.Save(t);

                return Convert.ToInt32(Convert.ToDouble(result.Response["ok"].RawValue)) > 0;
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("Save 失败: {0} ", ex.Message), ex);
                return false;
            }
        }
        #endregion


        #region 批量插入

        public bool InsertBulk<T>(IEnumerable<T> list) => InsertBulk(tableName, list);

        public bool InsertBulk<T>(string table, IEnumerable<T> list) => InsertBulk<T>(databaseName, table, list);

        public bool InsertBulk<T>(string database, string table, IEnumerable<T> list)
        {
            try
            {
                //如果不判断count,mongodb会抛出异常,所以这里加上一个判断
                if (list == null || list.Count() == 0) return true;

                var db = server.GetDatabase(database);   //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                collection.InsertBatch(list);

                return true;
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("InsertBulk 失败: {0} ", ex.Message), ex);

                return false;
            }
        }


        #endregion


        #region 查找操作

        public List<T> Find<T>(Expression<Func<T, bool>> func) => Find<T>(tableName, func);

        public List<T> Find<T>(string table, Expression<Func<T, bool>> func) => Find<T>(databaseName, table, func);

        public List<T> Find<T>(string database, string table, Expression<Func<T, bool>> func)
        {
            var list = new List<T>();

            try
            {
                var db = server.GetDatabase(database);    //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                list = collection.Find(Query<T>.Where(func)).ToList();
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("Find 失败: {0} ", ex.Message), ex);

                throw;
            }

            return list;
        }


        public T FindOne<T>(Expression<Func<T, bool>> func) => FindOne<T>(tableName, func);

        public T FindOne<T>(string table, Expression<Func<T, bool>> func) => FindOne<T>(databaseName, table, func);

        public T FindOne<T>(string database, string table, Expression<Func<T, bool>> func)
        {
            var t = default(T);

            try
            {
                var db = server.GetDatabase(database);    //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                t = collection.FindOne(Query<T>.Where(func));
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("FindOne 失败: {0} ", ex.Message), ex);

                throw;
            }

            return t;
        }

        #endregion


        #region 查找并删除 【只能查找找匹配的第一条】,找到就删除

        public T FindOneAndRemove<T>(Expression<Func<T, bool>> func)
             => FindOneAndRemove(databaseName, tableName, func);

        public T FindOneAndRemove<T>(string table, Expression<Func<T, bool>> func)
                    => FindOneAndRemove(databaseName, table, func);

        public T FindOneAndRemove<T>(string database, string table, Expression<Func<T, bool>> func)
        {
            T t = default(T);

            try
            {
                var db = server.GetDatabase(database);   //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                FindAndRemoveArgs args = new FindAndRemoveArgs();

                args.Query = Query<T>.Where(func);

                var findAndModifyResult = collection.FindAndRemove(args);

                t = findAndModifyResult.GetModifiedDocumentAs<T>();
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("SearchAndRemove 失败: {0} ", ex.Message), ex);
            }

            return t;
        }

        #endregion



        #region  目前支持修改一个参数,找到并修改

        public T FindOneAndModify<T, A>(Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
                                     => FindOneAndModify(databaseName, tableName, func, arg1key, arg1value);

        public T FindOneAndModify<T, A>(string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
                                             => FindOneAndModify(databaseName, table, func, arg1key, arg1value);

        public T FindOneAndModify<T, A>(string database, string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
        {
            T t = default(T);

            try
            {
                var db = server.GetDatabase(database);   //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                FindAndModifyArgs args = new FindAndModifyArgs();

                args.Query = Query<T>.Where(func);

                args.Update = Update<T>.Set<A>(arg1key, arg1value);

                var findAndModifyResult = collection.FindAndModify(args);

                t = findAndModifyResult.GetModifiedDocumentAs<T>();
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("SearchOneAndModify 失败: {0} ", ex.Message), ex);
            }

            return t;
        }
        #endregion


        #region 更新记录

        /// <summary>
        /// 已指定“批量更新”
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="A"></typeparam>
        /// <param name="func"></param>
        /// <param name="arg1key"></param>
        /// <param name="arg1value"></param>
        /// <returns></returns>
        public bool Modify<T, A>(Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
                            => Modify<T, A>(databaseName, tableName, func, arg1key, arg1value);

        /// <summary>
        /// 已指定“批量更新”
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="A"></typeparam>
        /// <param name="table"></param>
        /// <param name="func"></param>
        /// <param name="arg1key"></param>
        /// <param name="arg1value"></param>
        /// <returns></returns>
        public bool Modify<T, A>(string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
            => Modify<T, A>(databaseName, table, func, arg1key, arg1value);

        /// <summary>
        /// 已指定“批量更新”
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="A"></typeparam>
        /// <param name="database"></param>
        /// <param name="table"></param>
        /// <param name="func"></param>
        /// <param name="arg1key"></param>
        /// <param name="arg1value"></param>
        /// <returns></returns>
        public bool Modify<T, A>(string database, string table, Expression<Func<T, bool>> func, Expression<Func<T, A>> arg1key, A arg1value)
        {
            try
            {
                var db = server.GetDatabase(database);    //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                var query = Query<T>.Where(func);

                var update = Update<T>.Set(arg1key, arg1value);

                var writeConcernResult = collection.Update(query, update, UpdateFlags.Multi);

                return writeConcernResult.DocumentsAffected > 0;
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("Exists 失败: {0} ", ex.Message), ex);

                throw;
            }
        }

        #endregion



        #region 查询所有数据

        public List<T> FindAll<T>() => FindAll<T>(databaseName, tableName);

        public List<T> FindAll<T>(string table) => FindAll<T>(databaseName, table);

        public List<T> FindAll<T>(string database, string table)
        {
            var list = new List<T>();

            try
            {
                var db = server.GetDatabase(database);    //mongodb中的数据库

                var collection = db.GetCollection<T>(table);

                list = collection.FindAll().ToList();

                return list;
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(string.Format("FindAll 失败: {0} ", ex.Message), ex);

                return list;
            }
        }
        #endregion



        #region 删除数据库/表
        public void Drop(MlevelEnum mlevel, string database = null, string table = null)
        {
            var tempdatabase = database ?? databaseName;

            var temptable = table ?? tableName;

            try
            {
                if (mlevel == MlevelEnum.tableName)
                {
                    var db = server.GetDatabase(tempdatabase);

                    db.DropCollection(temptable);
                }
                else
                {
                    server.DropDatabase(tempdatabase);
                }
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog("DropDatabase失败", ex);
            }
        }

        public CommandResult DropDataBaseOrTable(MlevelEnum mlevel, string database = null, string table = null)
        {
            BsonDocument response = new BsonDocument();

            CommandResult result = new CommandResult(response);

            var tempdatabase = database ?? databaseName;

            var temptable = table ?? tableName;

            try
            {
                if (mlevel == MlevelEnum.tableName)
                {
                    var db = server.GetDatabase(tempdatabase);

                    return db.DropCollection(temptable);
                }
                else
                {
                    return server.DropDatabase(tempdatabase);
                }
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog("DropDatabase失败", ex);
            }

            return result;
        }

        #endregion

    }

    public enum MlevelEnum
    {
        databaseName = 1,
        tableName = 2
    }
}
MongoDBHelper

免责声明:文章转载自《MongoDB基础入门003--使用官方驱动操作mongo,C#》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇通过批处理变更系统时间pyhanlp安装教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

提高防OCR的一种办法

今天因为某件事情,想搞个图片,想防止被OCR。 各种试,但不得不说现在的OCR真的牛啊,变形,加噪,横线,仍然难以阻挡。 后面试了不下百十来种字体,但仍然无效,比如下面的 也试了一种简单办法 ,有点小用,但也没大用 但最后试出一种结果,可以有效的防止OCR(只是目前),拿三家大厂来试一下 腾讯 https://cloud.tencent.com/pro...

深入理解NIO(二)—— Tomcat中对NIO的应用

深入理解NIO(二)—— Tomcat中对NIO的应用 老哥行行好,转载和我说一声好吗,我不介意转载的,但是请把原文链接贴大点好吗 Tomcat大致架构 先贴两张图大致看一眼Tomcat的架构 Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container; Ser...

mysql通过mysqldump备份数据库忽略表

使用mysqldump备份数据时可以使用设置 --ignore-table参数进行表的忽略备份! 单表: --ignore-table=数据库名.表名 多表:--ignore-table=数据库名.表名  --ignore-table=数据库名.表名 以下是 mysqldump 的一些使用参数 备份数据库#mysqldump 数据库名 >数据库备份名...

JS URL参数传递 谷歌乱码解决

//第一个页面 var name=encodeURIComponent("参数"); var url="test1.html?name="+name; //第二个页面 var name=GetUrlParameters("name"); // 获取参数方法 name=decodeURIComponent(name); //encodeURICompon...

jsp、javabean、el

JSP三大指令一个jsp页面中,可以有0~N个指令的定义!1. page --> 最复杂:<%@page language="java" info="xxx"...%>* pageEncoding和contentType:> pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.j...

Lua中table的实现-《Lua设计与实现》

本文来自《Lua设计与实现》的阅读笔记,推荐Lua学习者可以购买一本,深入浅出讲解lua的设计和实现原理,很赞,哈哈   Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组的下标是从1开始的,对于散列表而言,只要其键值补位nil,都可以存储在其中。   一、table的基本类型定义 首先看看table的数据定义,参考源码lobject.h...