您的位置:首页 > 数据库 > Mongodb

C#MongoDb 学习笔记

2018-02-21 21:17 441 查看
本文大部分资料来源于网络资料、书,经过一步步验证,总结为一篇自己的学习记录。
简介: 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),stati
4000
stics_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
admin 0.000GB
local 0.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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# MongoDB