2月 3, 2018 - .net, nosql    2 Comments

太唐突了不好呦^_^之 .net 使用MongoDB

上篇:介绍*安装

One: 先简单介绍一下人家MongoDB,以免显得太唐突了

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

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

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

  MongoDB服务端可运行在LinuxWindows或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB.

其特点:

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  1)面向集合存储,易存储对象类型的数据。

  2)模式自由。

  3)支持动态查询。

  4)支持完全索引,包含内部对象。

  5)支持查询。

  6)支持复制和故障恢复。

  7)使用高效的二进制数据存储,包括大型对象(如视频等)。

  8)自动处理碎片,以支持云计算层次的扩展性。

  9)支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

  10)文件存储格式为BSON(一种JSON的扩展)。

  11)可通过网络访问。

  (来源于百度百科)

Two : 实战: 安装及常用命令

首先工欲善其事必先利其器: 下载地址: http://dl.mongodb.org/dl/win32/x86_64

,这里我使用的第一个,实测可用,安装即可. 我的安装路径 C:\mogodb

安装完成后就会生成bin文件夹,里面就是

其中:Mongod.exe 连接到mongo数据库服务器的,即服务器端。

Mongo.exe 启动MongoDB shell的,即客户端。

mongodump.exe 逻辑备份工具。

mongorestore.exe 逻辑恢复工具。

mongoexport.exe  数据导出工具。

mongoimport.exe  数据导入工具。

注意创建文件夹C:\mongodb\data\db、C:\mongodb\logs,C:mongodb\conf分别用来安装db和日志文件和配置文件,在log文件夹下创建一个日志文件mongoDB.log,即c:\mongodb\logs\MongoDB.log,, 在conf下创建一个日志文件mongodb.config,

其中mongodb.config 中写相关配置路径及配置:

dbpath=C:\mongodb\data 
logpath=C:\mongodb\logs\MongoDB.log 
logappend=true 
journal=true 
quiet=true 
port=27017  

Three : 开启mongoDB服务, 以管理员身份启动cmd命令窗口,输入mongod,若命名无效则需要加入环境变量,具体操作百度一下就可,比较简单,若确认加好了环境变量结果还是无效,则重启电脑即可.

mongoDB 的命令好用了 就可以了启动服务端了命令如下:

进入到安装mongodb的文件夹下的bin目录运行 mongod.exe –config C:\mongodb\conf\mongodb.config

再 net start mongodb

然后呢就可以点击mongodb/bin下的mongo.exe 

输入db显示出来test 说明就可以正常连接上了,再简单插入一条数据查一下

完成了安装调试后就可以着手用vs连接使用mongoDB了

下篇: vs*应用

首先得在项目中安装mongodb的驱动在nuget 包管理工具中运行:

Install-Package mongocsharpdriver 

1: 简单的连接数据库:
// 引用是必要的引用
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using MongoDB.Driver.Core.Servers;
using MongoDB.Driver.GridFS;
using MongoDB.Driver.Linq;
namespace Test.Test
{
    public class TestMongoDb
    {
        private  static readonly string connectMongo = "mongodb://localhost:27017";

         private  static readonly string dbName = "test";

        var client = new MongoClient(connectMongo);

         var db = client.GetDatabase(dbName);
    }

2: 为了避免连接时多次实例化:故很有必要采用单例模式
        
     public class DB
     {
          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(connectMongo);
                          db = client.GetDatabase(dbName);
                      }
                  }
              }
              return db;
          }
     }

那么连接时就应该改成下面的内容

public class TestMongoDb
{
        var client = new MongoClient(connectMongo);
        var db = client.GetDatabase(dbname);

 }   

连接好后就可以创建集合(表),然后就可以进行一番增删改查了

// 先定义一个集合:定义好属性 注:[BsonIgnoreExtraElements]是忽略比如主键ID时间等其它无用字段,插入的时候就不用增加ID了,否则会报错

[BsonIgnoreExtraElements]

public class TestItems
     {
             public int  UserId {get; set;}
             public string  Describe {get; set;}
             public DateTime Time {get; get;}
             public string Method {get; set;}
     }

// 对集合进行操作

 public class TestMongoDb
     {
              var client = new MongoClient(connectMongo);
              var db = client.GetDatabase(dbname);
              var testCollection = db.GetCollection<TestItems>(typeOf(TestItems).name);

              //  语法 : 新增
              testCollection.InsertOne(new TestItems{
                  UserId = "123",
                 Describe = "这是一个测试数据",
                 Method = "test"
              });
              // 查询 
              //  将时间转换成标准时间
               var today = BsonDateTime.Create(DateTime.Now.ToUniversalTime().Date);
               var Query = testCollection.Find(e => e.UserId == "123" &&  e.Time == today).FirstOrDefault();
               // 查多个
         var test = collection.Find(e => e.Describe == "test").ToList();

         更新一条数据的其中一个字段
        var update = Builders<TestItems>.Filter.Eq("Describe", "这是一个测试数据");
        var updateData = Builders<TestItems>.Update.Set("Method", "sdf");
        var result = collection.UpdateOne(update, updateData);

         更新一条数据的多个字段
        
        var entity = new TestItems()
        {
            UserId = "123",
            Describe = "这是一个测试数据",
            Method = "test"
        };

// 下面的查询时根据ID查的
          var queryRes = collection.Find(e => e.Id.Equals(ObjectId.Parse("5a60a5d42f782f46c4ba51b1"))).FirstOrDefault();
         foreach (var prop in entity.GetType().GetProperties())
        {
            var newdata = prop.GetValue(entity);
            var olddata = queryRes.GetType().GetProperty(prop.Name).GetValue(queryRes);
            if (newdata != null)
            {
                if (olddata == null)
                    olddata = "";
                if (!newdata.ToString().Equals(olddata.ToString()))
                {
                    queryRes.GetType().GetProperty(prop.Name).SetValue(queryRes, newdata);
                }
            }
        }
        var updateFilter = Builders<TestItems>.Filter.Eq("Id", ObjectId.Parse("5a60a5d42f782f46c4ba51b1"));
        ReplaceOneResult updateResult = collection.ReplaceOne(updateFilter, queryRes).Result;

        // 删除
         var filter = collection.DeleteOne(Builders<TestItems>.Filter.Eq("Describe","Test"));
     }

   注意 : 注意: 注意 重要的事情说三遍 :  mongodb插入的时间默认是国际标准时间,比咱们北京时间(东八区)少了8个小时, 注意查询的时候这8个小时哦, 或者都转成一致的标准时间也可以呀.

若是想用mongoDB的时间查询相关..如:查询一个客户从startTime到endTime(都是北京时间) 中的XXX数据

首先先看一下mongDb中存的形式是: ISODate("2018-01-19T00:00:00Z"),而你要是用linq 语句进行查询你是不是首先想到的是 :

var data = testCollection.Find(e => e.UserId = "123" && e.Time >= startTime &&  e.Time <= endTime);

结果一运行就报错了, 然后各种百度说建议用原生的mongodb 查询语句,类似于这样写:

db.CollectionAAA.find({ "CreateTime" : { "$gte" : ISODate("2017-04-20T00:00:00Z")  , "$lt" : ISODate("2017-04-21T00:00:00Z") } }).count() .

, 有没有搞错???,若是用原生的语句, 岂不是白瞎了框架, 别闹!! ! 思来想去,转化一下时间格式不就OK了,,只需要将条件改成与ISODATA 类型,

var startTimeOption = BsonDateTime.Create(startTime.ToUniversalTime());

var endTimeOption = BsonDataTime.Create(endTime.ToUniversalTime());

var data = testCollection.Find(e => e.UserId = "123" && e.Time >= startTimeOption &&  e.Time <= endTimeOption );

这样就OK了!!

当然将参数(一般是北京时间)减去8个小时也可以.那么转换就应该这样写了

var startTimeOption = BsonDateTime.Create(startTime.AddHours(-8));

var endTimeOption = BsonDataTime.Create(endTime.AddHours(-8));

打完收工!!

评论被关闭。