C#MongoDb 学习笔记

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 15:23   28   0

本文大部分资料来源于网络资料、书,经过一步步验证,总结为一篇自己的学习记录。

简介: MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,类似Json的bson格式,因此可以存储比较复杂的数据类型。

为什么使用MongoDB? 我们正在不断的将我们的对象图转换为关系模型,有时候这些转换很简单,但在大多数应用中他变得过于复杂。从关系模型检索数据库到对象模型时,我们也面临类似的挑战。

下载MongoDB: (官方) http://dl.mongodb.org/dl/win32/x86_64

解压后得到下面的exe文件

文件说明:

Mongo.exe 命令行客户端工具

Mongod.exe 数据库服务程序

Mogodump.exe 数据库备份程序

Mongoexport.exe 数据导出工具

Mongofiles.exe GridFS工具

Mongoimport.exe 数据导入工具

Mongorestore 数据恢复工具

Mogos.exe 性能检测工具

设置MonoDB目录:

将其解压到d:\mongodb,exe所在位置为d:\mongodb\bin

设置数据文件路径:

在d:\mongodb目录创建data文件夹,在data文件夹新建db文件夹,log文件夹

启动MongoDB服务

参考地址:http://www.cnblogs.com/snake-hand/p/3172376.html

打开cmd ,输入以下命令

d:

cd d:\mongodb\bin

mongod.exe --dbpath= d:\mongodb\db

2018-02-18T01:31:19.108+0800 I CONTROL [initandlisten] MongoDB starting : pid=19532 port=27017dbpath=D:\workfloder\2018Study\MongoDB\mongodb-win32-x86_64-v3.4-latest\mongodb-win32-x86_64-3.4.13-13-g6408164\data\db64-bit host=guanzhx

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] targetMinOS: WindowsVista/Windows Server 2008

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] db versionv3.4.13-13-g6408164

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] git version:6408164d14181b8717bdcb462456a90c16020a42

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] allocator: tcmalloc

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] modules: none

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] build environment:

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] distarch: x86_64

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] target_arch: x86_64

2018-02-18T01:31:19.109+0800 I CONTROL [initandlisten] options: { storage: { dbPath:"D:\workfloder\2018Study\MongoDB\mongodb-win32-x86_64-v3.4-latest\mongodb-win32-x86_64-3.4.13-13-g6408164\data\db"} }

2018-02-18T01:31:19.110+0800 I - [initandlisten] Detected data files inD:\workfloder\2018Study\MongoDB\mongodb-win32-x86_64-v3.4-latest\mongodb-win32-x86_64-3.4.13-13-g6408164\data\dbcreated by the 'wiredTiger' storage engine, so setting the active storageengine to 'wiredTiger'.

2018-02-18T01:31:19.110+0800 I STORAGE [initandlisten] wiredtiger_open config:create,cache_size=7616M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),verbose=(recovery_progress),

2018-02-18T01:31:19.646+0800 I STORAGE [initandlisten] WiredTiger message [1518888679:645990][19532:140707715244368],txn-recover: Main recovery loop: starting at 2/4224

2018-02-18T01:31:19.786+0800 I STORAGE [initandlisten] WiredTiger message[1518888679:786143][19532:140707715244368], txn-recover: Recovering log 2through 3

2018-02-18T01:31:19.923+0800 I STORAGE [initandlisten] WiredTiger message[1518888679:922973][19532:140707715244368], txn-recover: Recovering log 3through 3

2018-02-18T01:31:20.372+0800 I CONTROL [initandlisten]

2018-02-18T01:31:20.373+0800 I CONTROL [initandlisten] ** WARNING: Access control isnot enabled for the database.

2018-02-18T01:31:20.375+0800 I CONTROL [initandlisten] ** Read and write access to data andconfiguration is unrestricted.

2018-02-18T01:31:20.376+0800 I CONTROL [initandlisten]

2018-02-18T01:31:21.103+0800 I FTDC [initandlisten] Initializing full-timediagnostic data capture with directory'D:/workfloder/2018Study/MongoDB/mongodb-win32-x86_64-v3.4-latest/mongodb-win32-x86_64-3.4.13-13-g6408164/data/db/diagnostic.data'

2018-02-18T01:31:21.106+0800 I NETWORK [thread1] waiting for connections on port27017

注意:MongoDB区分大小写。如果指定了日志路径,则在cmd上不会显示信息,而是输入到了日志文件中。

如果看到以上信息,则说明MongoDB服务启动成功了,红色字体为启动服务主机信息

将MongoDB作为Windows服务随机启动

创建好日志目录后,cmd命令:

mongod.exe --dbpath=d:\mongodb\db --logpath d:\mongodb\data\log\mongodb.log–logappend --serviceName guanzhx_MongoDBService --serviceDisplayName guanzhx_MongoDBService-install

卸载服务:

mongod.exe--serviceName guanzhx_MongoDBService -remove

接下来打开客户端连接服务:

直接打开bin目录的mongo.exe

MongoDB shell version v3.4.13-13-g6408164

connecting to: mongodb://127.0.0.1:27017

MongoDB server version: 3.4.13-13-g6408164

连接成功,此时可以输入命令查看所有表:

> show dbs

admin0.000GB

local0.000GB

此时可以查看mongodb.log日志文件,可以查看MongoDB服务的运行情

网页访问:http://localhost:27017/

It looks like you are trying to accessMongoDB over HTTP on the native driver port.

至此,MongoDB服务已经正常运行了。

简单命令介绍:

引用数据库: use 表名

查询数据: 条件:db.表名.findOne({“字段1”:”值”})无条件 db.表名.find({})

启用验证: --auth=true

其他详细命令参考:http://blog.csdn.net/guoxingege/article/details/47339885

思考:

MongoDB服务启动命令是可以使用配置文件来统一设置的,但个人在MongoDB使用中常用到的命令不多,制成bat脚本即可。

将命令合并到bat批命令脚本启动MongoDB服务,在测试过程中,因使用的win10家庭版操作系统,时常遇到权限问题,那么可以一同用命令来解决:

@echo off

CLS

ECHO.

ECHO ================================

ECHO 尝试获取管理员权限

ECHO ================================

:init

setlocal DisableDelayedExpansion

set "batchPath=%~0"

for %%k in (%0) do set batchName=%%~nk

set"vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"

setlocal EnableDelayedExpansion

:checkPrivileges

NET FILE 1>NUL 2>NUL

if '%errorlevel%' == '0' ( gotogotPrivileges ) else ( goto getPrivileges )

:getPrivileges

if '%1'=='ELEV' (echo ELEV & shift /1& goto gotPrivileges)

ECHO.

ECHO ********************************

ECHO 请求 UAC 权限批准……

ECHO ********************************

ECHO Set UAC =CreateObject^("Shell.Application"^) >"%vbsGetPrivileges%"

ECHO args = "ELEV " >>"%vbsGetPrivileges%"

ECHO For Each strArg in WScript.Arguments>> "%vbsGetPrivileges%"

ECHO args = args ^& strArg ^&" " >>"%vbsGetPrivileges%"

ECHO Next >>"%vbsGetPrivileges%"

ECHO UAC.ShellExecute"!batchPath!", args, "", "runas", 1 >>"%vbsGetPrivileges%"

"%SystemRoot%\System32\WScript.exe""%vbsGetPrivileges%" %*

exit /B

:gotPrivileges

setlocal & pushd .

cd /d %~dp0

if '%1'=='ELEV' (del"%vbsGetPrivileges%" 1>nul 2>nul &shift /1)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::以下为需要运行的批处理文件代码 ::

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

rem 本行以下可修改为你需要的bat命令(从上面三行冒号开始到下面都可删改)

ECHO 正在启动服务...

SET VERSION=guanzhx

SET CURRENTPATH=%~dp0

SETLOGPATH=%CURRENTPATH%\data\log\mongodb.log

SET DBPATH=%CURRENTPATH%\data\db

cd bin

mongod.exe --logpath %LOGPATH% --logappend--dbpath %DBPATH% --serviceName %VERSION%_MongoDBService --serviceDisplayName%VERSION%_MongoDBService -install

net start %VERSION%_MongoDBService

pause

================================

尝试获取管理员权限

================================

正在启动服务...

guanzhx_MongoDBService 服务正在启动 ..

guanzhx_MongoDBService 服务已经启动成功。

请按任意键继续. . .

当然卸载服务也类似。


在.NET中使用MongoDB

GitHub源码地址:https://github.com/samus/mongodb-csharp/tree/master

可视化工具Robomongo

下载地址:https://robomongo.org/download

可视化工具(官方)

下载地址:https://www.mongodb.com/download-center?jmp=nav#community

下载GitHub源码后进行编译,可以获得MongoDB.dll,引用项目即可。

在源码中已经包含了使用示例,研究后简化出常用的方法。

Demo共享(VS2017):https://pan.baidu.com/s/1xVk5g0p1_UU6O1I0n0LXTg

MongoDBHelper(基础方法全部封装完成):

using MongoDB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MongoDb.Utils
{
    public static class MongDBHelper
    {
        private static readonly string _connectionString = "Server=127.0.0.1";

        private static readonly string _dbName = "MyNorthwind";

        // 摘记: safemode:仅在写入数据库时才有用 
        // 为了提高速度,如果安全模式关闭并且写入操作失败,则驱动程序不会等待,.NET不会引发异常
        // 将safemode设置为true将强制驱动程序等待成功确认,并且如果发生错误就会引发异常
        // 使用安全模式处理您关心的数据
        // MongoDB默认行为是关闭


        /// <summary>
        /// 增加一条记录
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity">实体</param>
        /// <param name="safeMode">安全模式</param>
        public static void Insert<T>(T entity, bool safeMode = false) where T : class
        {
            using (Mongo mongo = new Mongo(_connectionString))
            {
                mongo.Connect();
                IMongoDatabase friends = mongo.GetDatabase(_dbName);
                // 两种方法: 调用  mh.Insert("类名称", 实例对象);
                IMongoCollection<T> categories = friends.GetCollection<T>();
                //  调用  mh.Insert<Customer>(实例对象);
                //IMongoCollection<T> categories = friends.GetCollection<T>("collectionName");
                categories.Insert(entity, safeMode);
                mongo.Disconnect();
            }
        }
        /// <summary>
        /// 增加多条记录
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity">实体</param>
        /// <param name="safeMode">安全模式</param>
        public static void Insert<T>(IEnumerable<T> entity, bool safeMode = false) where T : class
        {
            using (Mongo mongo = new Mongo(_connectionString))
            {
                mongo.Connect();
                IMongoDatabase friends = mongo.GetDatabase(_dbName);
                // 两种方法: 调用  mh.Insert("类名称", 实例对象);
                IMongoCollection<T> categories = friends.GetCollection<T>();
                //  调用  mh.Insert<Customer>(实例对象);
                //IMongoCollection<T> categories = friends.GetCollection<T>("collectionName");
                categories.Insert(entity, safeMode);
                mongo.Disconnect();
            }
        }
        /// <summary>
        /// 更新一条记录
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="query"></param>
        /// <param name="collectionName"></param>
        /// <param name="safeMode">安全模式</param>
        public static void Update<T>(T entity, Document query,string collectionName,bool safeMode=false) where T : class
        {
            using (Mongo mongo = new Mongo(_connectionString))
            {
                mongo.Connect();
                IMongoDatabase db = mongo.GetDatabase(_dbName);
                IMongoCollection<Document> collection = db.GetCollection<Document>(collectionName);
                Document record = collection.FindOne(query);
                var selector = new Document { { "_id", record["_id"] } };
                // 更新对象
                collection.Update(entity, selector, safeMode);
            }
        }
        /// <summary>
        /// 获取一条数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collectionName"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public static T GetOne<T>(Document query) where T : class
        {
            T result = default(T);
            using (Mongo mongo = new Mongo(_connectionString))
            {
                mongo.Connect();
                IMongoDatabase friends = mongo.GetDatabase(_dbName);
                IMongoCollection<T> categories = friends.GetCollection<T>();
                result = categories.FindOne(query);
                mongo.Disconnect();
            }
            return result;
        }
        /// <summary>
        /// 获取一个集合下所有数据
        /// </summary>
        /// <returns></returns>
        public static List<T> GetAll<T>() where T : class
        {
            List<T> result = new List<T>();
            using (Mongo mongo = new Mongo(_connectionString))
            {
                mongo.Connect();
                IMongoDatabase friends = mongo.GetDatabase(_dbName);
                IMongoCollection<T> categories = friends.GetCollection<T>();
                foreach (T entity in categories.FindAll().Documents)
                {
                    result.Add(entity);
                }
                mongo.Disconnect();

            }
            return result;
        }
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="query"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        public static List<T> GetList<T>(Document selector, int pageIndex, int pageSize) where T : class
        {
            List<T> result = new List<T>();
            using (Mongo mongo = new Mongo(_connectionString))
            {
                mongo.Connect();
                IMongoDatabase friends = mongo.GetDatabase(_dbName);
                IMongoCollection<T> categories = friends.GetCollection<T>();
                // 使用这种语法不支持: .Sort(sort).Skip((cp - 1) * mp).Limit(mp)
                foreach (T entity in categories.Find(selector, pageSize, (pageIndex - 1) * pageSize).Documents)
                {
                    result.Add(entity);
                }
                mongo.Disconnect();
                //linq的一种写法
                //collection.FindOne(x => x.CustomerID == searchWord || x.CustomerName == searchWord || x.ContactName == searchWord);
            }
            return result;
        }
        /// <summary>
        /// 删除数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collectionName"></param>
        /// <param name="query"></param>
        public static void Delete<T>(string collectionName,Document query) where T : class
        {
            using (Mongo mongo = new Mongo(_connectionString))
            {
                mongo.Connect();
                IMongoDatabase friends = mongo.GetDatabase(_dbName);
                IMongoCollection<T> categories = friends.GetCollection<T>(collectionName);
                categories.Remove(query, true);
                mongo.Disconnect();
            }
        }
    }
}

调用:

using MongoDb.Utils;
using MongoDB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MongoDb.Consoles
{
    class Program
    {

        static void Main(string[] args)
        {

            
            // insert 

            Customer ct = new Customer();
            ct.CustomerID = Guid.NewGuid().ToString();
            ct.CustomerName = "guanzhx";
            ct.ContactName = "帅哥";
            ct.Address = "地球";
            ct.PostalCode = "100000";
            ct.Tel = "110";
            MongDBHelper.Insert<Customer>(ct,true);

            // update 
            Document dc = new Document { { "CustomerName", "guanzhx" } };
            MongDBHelper.Update<Customer>(ct, dc, "Customer");

            // 查询一条记录
            Console.WriteLine("查询单条记录:"+MongDBHelper.GetOne<Customer>(dc).ContactName);
            // 查询所有记录
            foreach (Customer item in MongDBHelper.GetAll<Customer>())
            {
                Console.WriteLine("循环输出所有记录:"+ item.ContactName);
            }
            // 查询条件集合
            Document searchWord = new Document { { "ContactName", "帅哥" } }; //"_id" : "5f0c841e-57f0-4189-8e9e-ff9edf21a7fc",
            foreach (Customer item in MongDBHelper.GetList<Customer>(searchWord, 1, 10))
            {
                Console.WriteLine("循环输出条件记录:" + item.ContactName);
            }
            // 删除
            MongDBHelper.Delete<Document>("Customer", searchWord);
            Console.WriteLine("删除记录:条件:ContactName=帅哥:");

            Console.ReadLine();
        }
    }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP