|
本文大部分资料来源于网络资料、书,经过一步步验证,总结为一篇自己的学习记录。 简介: 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();
}
}
}
|