太唐突了不好呦^_^之 .net 使用MongoDB
上篇:介绍*安装
One: 先简单介绍一下人家MongoDB,以免显得太唐突了
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB服务端可运行在Linux、Windows或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));
打完收工!!