首页 > 代码库 > .NET平台下使用MongoDB入门教程

.NET平台下使用MongoDB入门教程

  适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员。因为本文是一篇入门级的文章。

一、了解MongoDB

   MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

   MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。

     MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

  MongoDB服务端可运行在Linux、Windows或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下载地址:https://www.mongodb.com/download-center#community

安装之后目录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,<optional params>)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{    /// <summary>    /// MongoDb帮助类    /// </summary>    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 MongoDbHelper<T> where T : BaseEntity    {        private IMongoDatabase db = null;        private IMongoCollection<T> collection = null;        public MongoDbHelper()        {            this.db = DB.GetDb();            collection = db.GetCollection<T>(typeof(T).Name);        }        /// <summary>        /// 新增        /// </summary>        /// <param name="entity"></param>        /// <returns></returns>        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;        }        /// <summary>        /// 修改        /// </summary>        /// <param name="id"></param>        /// <param name="field"></param>        /// <param name="value"></param>        public void Modify(string id, string field, string value)        {            var filter = Builders<T>.Filter.Eq("Id", ObjectId.Parse(id));            var updated = Builders<T>.Update.Set(field, value);            UpdateResult result = collection.UpdateOneAsync(filter, updated).Result;        }        /// <summary>        /// 更新        /// </summary>        /// <param name="entity"></param>        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 =http://www.mamicode.com/ prop.GetValue(entity);                    var oldValue =http://www.mamicode.com/ old.GetType().GetProperty(prop.Name).GetValue(old);                    if (newValue != null)                    {                        if (oldValue =http://www.mamicode.com/= 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<T>.Filter.Eq("Id", entity.Id);                ReplaceOneResult result = collection.ReplaceOneAsync(filter, old).Result;            }            catch (Exception ex)            {                var aaa = ex.Message + ex.StackTrace;                throw;            }        }        /// <summary>        /// 删除        /// </summary>        /// <param name="entity"></param>        public void Delete(T entity)        {            var filter = Builders<T>.Filter.Eq("Id", entity.Id);            collection.DeleteOneAsync(filter);        }        /// <summary>        /// 根据id查询一条数据        /// </summary>        /// <param name="id"></param>        /// <returns></returns>        public T QueryOne(string id)        {            return collection.Find(a => a.Id == ObjectId.Parse(id)).ToList().FirstOrDefault();        }        /// <summary>        /// 查询所有数据        /// </summary>        /// <returns></returns>        public List<T> QueryAll()        {            return collection.Find(a => a.State != "").ToList();        }        /// <summary>        /// 根据条件查询一条数据        /// </summary>        /// <param name="express"></param>        /// <returns></returns>        public T QueryByFirst(Expression<Func<T,bool>> express)        {            return collection.Find(express).ToList().FirstOrDefault();        }        /// <summary>        /// 批量添加        /// </summary>        /// <param name="list"></param>        public void InsertBatch(List<T> list)        {            collection.InsertManyAsync(list);        }        /// <summary>        /// 根据Id批量删除        /// </summary>        public void DeleteBatch(List<ObjectId> list)        {            var filter = Builders<T>.Filter.In("Id", list);            collection.DeleteManyAsync(filter);        }        /// <summary>        /// 未添加到索引的数据        /// </summary>        /// <returns></returns>        public List<T> QueryToLucene()        {            return collection.Find(a => a.State.Equals("y")|| a.State.Equals("n")).ToList();        }    }    public class mongoCustomer : BaseEntity    {        /// <summary>        /// 购方名称        /// </summary>        public string Name { get; set; }        /// <summary>        /// 纳税人识别号        /// </summary>        public string TaxCode { get; set; }        /// <summary>        /// 地址电话        /// </summary>        public string AddressPhone { get; set; }        /// <summary>        /// 开户行及账号        /// </summary>        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:http://www.runoob.com/mongodb/mongodb-window-install.html

.NET平台下使用MongoDB入门教程