正文
适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员。因为本文是一篇入门级的文章。
一、了解MongoDB
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB服务端可运行在、或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB
(百度百科)
二、MongoDB特点
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
1)面向集合存储,易存储对象类型的数据。
2)模式自由。
3)支持动态查询。
4)支持完全索引,包含内部对象。
5)支持查询。
6)支持复制和故障恢复。
7)使用高效的二进制数据存储,包括大型对象(如视频等)。
8)自动处理碎片,以支持云计算层次的扩展性。
9)支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
10)文件存储格式为BSON(一种JSON的扩展)。
11)可通过网络访问。
(百度百科)
三、安装及常用命令
3.1 下载安装
MongoDB下载地址:
安装之后目录bin文件夹下会有一堆exe文件
Mongod.exe 连接到mongo数据库服务器的,即服务器端。
Mongo.exe 启动MongoDB shell的,即客户端。
mongodump.exe 逻辑备份工具。
mongorestore.exe 逻辑恢复工具。
mongoexport.exe 数据导出工具。
mongoimport.exe 数据导入工具。
3.2 启动服务器
新建dbpath用来存储数据文件 随便一个路径都可以,d:\data\db (没有这个目录的话会报错)
CMD命令启动
3.3 常用操作
双击mongo.exe进行操作
>use DATABASE_NAME //如果数据库不存在,则创建数据库,否则切换到指定数据库。>show dbs //显示所有数据库>show collections //显示当前数据库下的所有集合>db.runoob.insert({"name":"菜鸟教程","taxcode":"123456"}) //添加数据> db.runoob.update({'name':'菜鸟教程'},{'$set':{'taxcode':'test'}},upsert=true,multi=false) //name为菜鸟教程 更新记录taxcode为test>db.runoob.find() //查询数据> db.runoob.remove() //删除所有数据> db.runoob.remove({'name':'菜鸟教程'}) //删除记录name为菜鸟教程>db.dropDatabase() //删除当前数据库
3.4 其他命令
db.AddUser(username,password) 添加用户db.auth(usrename,password) 设置数据库连接验证db.cloneDataBase(fromhost) 从目标服务器克隆一个数据库db.commandHelp(name) returns the help for the commanddb.copyDatabase(fromdb,todb,fromhost) 复制数据库fromdb---源数据库名称,todb---目标数据库名称,fromhost---源数据库服务器地址db.createCollection(name,{size:3333,capped:333,max:88888}) 创建一个数据集,相当于一个表db.currentOp() 取消当前库的当前操作db.dropDataBase() 删除当前数据库db.eval(func,args) run code server-sidedb.getCollection(cname) 取得一个数据集合,同用法:db['cname'] ordb.getCollenctionNames() 取得所有数据集合的名称列表db.getLastError() 返回最后一个错误的提示消息db.getLastErrorObj() 返回最后一个错误的对象db.getMongo() 取得当前服务器的连接对象get the serverdb.getMondo().setSlaveOk() allow this connection to read from then nonmaster membr of a replica pairdb.getName() 返回当操作数据库的名称db.getPrevError() 返回上一个错误对象db.getProfilingLevel() db.getReplicationInfo() 获得重复的数据db.getSisterDB(name) get the db at the same server as this onewdb.killOp() 停止(杀死)在当前库的当前操作db.printCollectionStats() 返回当前库的数据集状态db.printReplicationInfo()db.printSlaveReplicationInfo()db.printShardingStatus() 返回当前数据库是否为共享数据库db.removeUser(username) 删除用户db.repairDatabase() 修复当前数据库db.resetError() db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj:1}db.setProfilingLevel(level) 0=off,1=slow,2=alldb.shutdownServer() 关闭当前服务程序db.version() 返回当前程序的版本信息db.test.find({id:10}) 返回test数据集ID=10的数据集db.test.find({id:10}).count() 返回test数据集ID=10的数据总数db.test.find({id:10}).limit(2) 返回test数据集ID=10的数据集从第二条开始的数据集db.test.find({id:10}).skip(8) 返回test数据集ID=10的数据集从0到第八条的数据集db.test.find({id:10}).limit(2).skip(8) 返回test数据集ID=1=的数据集从第二条到第八条的数据db.test.find({id:10}).sort() 返回test数据集ID=10的排序数据集db.test.findOne([query]) 返回符合条件的一条数据db.test.getDB() 返回此数据集所属的数据库名称db.test.getIndexes() 返回些数据集的索引信息db.test.group({key:...,initial:...,reduce:...[,cond:...]})db.test.mapReduce(mayFunction,reduceFunction,)db.test.remove(query) 在数据集中删除一条数据db.test.renameCollection(newName) 重命名些数据集名称db.test.save(obj) 往数据集中插入一条数据db.test.stats() 返回此数据集的状态db.test.storageSize() 返回此数据集的存储大小db.test.totalIndexSize() 返回此数据集的索引文件大小db.test.totalSize() 返回些数据集的总大小db.test.update(query,object[,upsert_bool]) 在此数据集中更新一条数据db.test.validate() 验证此数据集db.test.getShardVersion() 返回数据集共享版本号
3.5 做成windows服务
mongod.exe --bind_ip 127.0.0.1 --logpath "d:\data\dbConf\mongodb.log" --logappend --dbpath "d:\data\db" --port 27017 --serviceName "myFirst" --serviceDisplayName "myFirst" --install
四、批处理程序开启MongoDB
写批处理程序是为了解决每次启动MongoDB都得敲doc命令
@echo@pausemongod -repair -dbpath "d:\data\db"mongod -dbpath "d:\data\db"@pause
把它复制到记事本,保存为.bat文件,然后和mongod.exe放在同一个目录,以后运行它就可以启动MongoDB服务器了。
PS:“mongod -repair -dbpath "E:\mongodbfiles"”是为了解决启动时有时会报错
五、可视化客户端工具
用客户端工具是为了解决每次都敲命令的问题,这里推荐两种工具Robomongo、MongoVUE
六、C#中使用MongoDB
MongoDB.Driver.dll:顾名思义,驱动程序
MongoDB.Bson.dll:序列化、Json相关
MongoDB帮助类代码:
/******************************************************* * * 作者:徐文东 * 创建日期:20170510 * 说明:MongoDb帮助类 * 运行环境:.NET 4.0 * 版本号:1.0.0 * * 历史记录: * 创建文件 徐文东 20170510 11:56 * *******************************************************/using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using MongoDB.Bson;using MongoDB.Driver;using MongoDB.Driver.Core.Servers;using System.Linq.Expressions;namespace DBI.SaaS.ExternalService.BigData{ ////// MongoDb帮助类 /// public class DB { private static readonly string connStr = "mongodb://127.0.0.1:27017";//GlobalConfig.Settings["mongoConnStr"]; private static readonly string dbName = "xuwendong";//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 MongoDbHelperwhere T : BaseEntity { private IMongoDatabase db = null; private IMongoCollection collection = null; public MongoDbHelper() { this.db = DB.GetDb(); collection = db.GetCollection (typeof(T).Name); } /// /// 新增 /// /// ///public T Insert(T entity) { var flag = ObjectId.GenerateNewId(); entity.GetType().GetProperty("Id").SetValue(entity, flag); entity.State = "y"; entity.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); entity.UpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); collection.InsertOneAsync(entity); return entity; } /// /// 修改 /// /// /// /// public void Modify(string id, string field, string value) { var filter = Builders.Filter.Eq("Id", ObjectId.Parse(id)); var updated = Builders .Update.Set(field, value); UpdateResult result = collection.UpdateOneAsync(filter, updated).Result; } /// /// 更新 /// /// public void Update(T entity) { try { var old = collection.Find(e => e.Id.Equals(entity.Id)).ToList().FirstOrDefault(); foreach (var prop in entity.GetType().GetProperties()) { 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()); } } } old.State = "n"; old.UpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var filter = Builders.Filter.Eq("Id", entity.Id); ReplaceOneResult result = collection.ReplaceOneAsync(filter, old).Result; } catch (Exception ex) { var aaa = ex.Message + ex.StackTrace; throw; } } /// /// 删除 /// /// public void Delete(T entity) { var filter = Builders.Filter.Eq("Id", entity.Id); collection.DeleteOneAsync(filter); } /// /// 根据id查询一条数据 /// /// ///public T QueryOne(string id) { return collection.Find(a => a.Id == ObjectId.Parse(id)).ToList().FirstOrDefault(); } /// /// 查询所有数据 /// ///public List QueryAll() { return collection.Find(a => a.State != "").ToList(); } /// /// 根据条件查询一条数据 /// /// ///public T QueryByFirst(Expression > express) { return collection.Find(express).ToList().FirstOrDefault(); } /// /// 批量添加 /// /// public void InsertBatch(Listlist) { collection.InsertManyAsync(list); } /// /// 根据Id批量删除 /// public void DeleteBatch(Listlist) { var filter = Builders .Filter.In("Id", list); collection.DeleteManyAsync(filter); } /// /// 未添加到索引的数据 /// ///public List QueryToLucene() { return collection.Find(a => a.State.Equals("y")|| a.State.Equals("n")).ToList(); } } public class mongoCustomer : BaseEntity { /// /// 购方名称 /// public string Name { get; set; } ////// 纳税人识别号 /// public string TaxCode { get; set; } ////// 地址电话 /// public string AddressPhone { get; set; } ////// 开户行及账号 /// public string BankAccount { get; set; } } public abstract class BaseEntity { public ObjectId Id { get; set; } public string State { get; set; } public string CreateTime { get; set; } public string UpdateTime { get; set; } }}
七、参考资料
windows平台下安装MongoDB: