博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于官方驱动封装mongodb
阅读量:4971 次
发布时间:2019-06-12

本文共 16233 字,大约阅读时间需要 54 分钟。

还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图(1)。

总的来说比较蛋疼,因为从来没有使用过mongoDB,从安装,到转为windows服务,设置权限等等,好吧这都是题外话。

在写这个MongoDB版本的时候遇到的一些问题,我先总结下:

1.MongoDb版本是官网最新版3.4.4,官方驱动为2.4.3,首先我的项目是以GUID做为主键,在往MongonDB中插入时遇到的是将GUID生成了MongoDB的LUUID格式产生了这样的格式(2)并且和我的数据库不同(3)当然redis也不同(4)。

a)带着问题我们去解决查了文档发现原来因为bson的键要标识成GUID,并且格式要转为string,既然知道问题了就去解决找到我的GUID主键,如下图(5):

在主键上加上 [BsonId(IdGenerator = typeof(GuidGenerator)), BsonRepresentation(BsonType.String)]这段就可以了,看了下效果确实可以了(6)。

2.但是在测试过程中查询的时候却找不到,一查原来我的数据库redis的id值都不一样,这又是怎么回事?

b)原来mongoDB生成的GUID和C#生成的GUID的进制是不一样的,为了解决这个问题,Google了一下,找到了一个脚本,把这个js脚本放在mongoDB里面执行一下,然后生成的GUID就和数据库的一样了。如图(7):

然后生成的_id就和我数据redis的一样了。(8)(9)

解决完成这些问题后开始写自己的封装类。

希望大家多给出建议,博主也是第一次玩mongoDB,如果有好的学习资源也请推荐给博主。

第一步创建连接:

using MongoDB.Driver;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace KuRuMi.Mio.DoMain.MongoDbCache.MongoDbCommon{    public class MongoDbManager    {        private static IMongoDatabase db = null;        private static readonly object locker = new object();        ///         /// 使用单列模式创建连接        ///         /// 
public static IMongoDatabase CreateDb() { if (db == null) { lock (locker) { if (db == null) { MongoClient Client = new MongoClient(MongoDbConfig.Host); db = Client.GetDatabase(MongoDbConfig.DataBase); } } } return db; } }}
View Code

第二步创建DB:

using MongoDB.Driver;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace KuRuMi.Mio.DoMain.MongoDbCache.MongoDbCommon{    public class MongoDbBase    {        private IMongoDatabase db = null;        public IMongoDatabase Db { get => db; }        public MongoDbBase()        {            db = MongoDbManager.CreateDb();        }    }}
View Code

然后呢献上自己的封装helper:

using KuRuMi.Mio.DoMain.MongoDbCache.MongoDbCommon;using MongoDB.Bson;using MongoDB.Driver;using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks;namespace KuRuMi.Mio.DoMain.MongoDbCache.MongoDbCache{    ///     /// MongoDb缓存    ///     public sealed class MongoDbCacheService : MongoDbBase    {        #region 同步        #region 增加        ///         /// 保存单个对象        ///         ///         /// 
public bool AddSignleObject
(TAggregateRoot Root) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); collection.InsertOne(Root); return true; } catch (Exception) { return false; } } ///
/// 批量保存多个对象 /// ///
///
public bool AddManyObject
(List
Root) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); collection.InsertMany(Root); return true; } catch (Exception) { return false; } } #endregion #region 删除 ///
/// 删除单个记录 /// ///
///
///
public int DeleteSingleIndex
(Expression
> filter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); return (int)collection.DeleteOne(filter).DeletedCount; } catch (Exception e) { throw e; } } #endregion #region 查询 ///
/// 查询单条记录 /// ///
///
///
public TAggregateRoot FindSingleIndex
(Expression
> filter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); return collection.Find(filter).FirstOrDefault(); } catch (Exception e) { throw e; } } ///
/// 查询整个集合 /// ///
///
///
public List
FindMany
(Expression
> filter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); return collection.Find(filter).ToList(); } catch (Exception e) { throw e; } } #endregion #region 更新 ///
/// 更新单个值 /// ///
///
///
///
///
public int UpdateSingle
(Expression
> filter, string name, string parameter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); var set = Builders
.Update.Set(name, parameter); return (int)collection.UpdateOne(filter, set).ModifiedCount; } catch (Exception e) { throw e; } } ///
/// 更新多个值 /// ///
///
///
///
///
public int UpdateMany
(Expression
> filter, TAggregateRoot Root, List
property = null, bool replace = false) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); var type = Root.GetType(); //修改集合 var list = new List
>(); foreach (var propert in type.GetProperties()) { if (propert.Name.ToLower() != "id") { try { if (property == null && property.Count < 1 || property.Any(o => o.ToLower() == propert.Name.ToLower())) { var replaceValue = propert.GetValue(Root); if (replaceValue != null) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); else if (replace) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); } } catch (Exception) { if (property == null) { var replaceValue = propert.GetValue(Root); if (replaceValue != null) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); else if (replace) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); } } } } if (list.Count > 0) { var builders = Builders
.Update.Combine(list); return (int)collection.UpdateOne(filter, builders).ModifiedCount; } return 0; } catch (Exception e) { throw e; } } #endregion #endregion #region 异步 #region 增加 ///
/// 异步保存单个对象 /// ///
///
public bool AddSignleObjectAsync
(TAggregateRoot Root) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); collection.InsertOneAsync(Root); return true; } catch (Exception) { return false; } } ///
/// 批量保存多个对象 /// ///
///
public bool AddManyObjectAsync
(List
Root) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); collection.InsertManyAsync(Root); return true; } catch (Exception) { return false; } } #endregion #region 删除 ///
/// 异步删除单个记录 /// ///
///
///
public int DeleteSingleIndexAsync
(Expression
> filter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); return (int)collection.DeleteOneAsync(filter).Result.DeletedCount; } catch (Exception e) { throw e; } } #endregion #region 查询 ///
/// 异步查询单条记录 /// ///
///
///
public TAggregateRoot FindSingleIndexAsync
(Expression
> filter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); return collection.FindAsync(filter).Result.FirstOrDefault(); } catch (Exception e) { throw e; } } ///
/// 异步查询整个集合 /// ///
///
///
public List
FindManyAsync
(Expression
> filter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); return collection.FindAsync(filter).Result.ToList(); } catch (Exception e) { throw e; } } #endregion #region 更新 ///
/// 异步更新单个值 /// ///
///
///
///
///
public int UpdateSingleAsync
(Expression
> filter, string name, string parameter) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); var set = Builders
.Update.Set(name, parameter); return (int)collection.UpdateOneAsync(filter, set).Result.ModifiedCount; } catch (Exception e) { throw e; } } ///
///异步更新多个值 /// ///
///
///
///
///
public int UpdateManyAsync
(Expression
> filter, TAggregateRoot Root, List
property = null, bool replace = false) { try { var collection = Db.GetCollection
(typeof(TAggregateRoot).Name); var type = Root.GetType(); //修改集合 var list = new List
>(); foreach (var propert in type.GetProperties()) { if (propert.Name.ToLower() != "id") { try { if (property == null && property.Count < 1 || property.Any(o => o.ToLower() == propert.Name.ToLower())) { var replaceValue = propert.GetValue(Root); if (replaceValue != null) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); else if (replace) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); } } catch (Exception) { if (property == null) { var replaceValue = propert.GetValue(Root); if (replaceValue != null) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); else if (replace) list.Add(Builders
.Update.Set(propert.Name, replaceValue)); } } } } if (list.Count > 0) { var builders = Builders
.Update.Combine(list); return (int)collection.UpdateOneAsync(filter, builders).Result.ModifiedCount; } return 0; } catch (Exception e) { throw e; } } #endregion #endregion }}
View Code

最后是脚本文件:

function HexToBase64(hex) {    var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";    var base64 = "";    var group;    for (var i = 0; i < 30; i += 6) {        group = parseInt(hex.substr(i, 6), 16);        base64 += base64Digits[(group >> 18) & 0x3f];        base64 += base64Digits[(group >> 12) & 0x3f];        base64 += base64Digits[(group >> 6) & 0x3f];        base64 += base64Digits[group & 0x3f];    }    group = parseInt(hex.substr(30, 2), 16);    base64 += base64Digits[(group >> 2) & 0x3f];    base64 += base64Digits[(group << 4) & 0x3f];    base64 += "==";    return base64;}function Base64ToHex(base64) {    var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";    var hexDigits = "0123456789abcdef";    var hex = "";    for (var i = 0; i < 24;) {        var e1 = base64Digits.indexOf(base64[i++]);        var e2 = base64Digits.indexOf(base64[i++]);        var e3 = base64Digits.indexOf(base64[i++]);        var e4 = base64Digits.indexOf(base64[i++]);        var c1 = (e1 << 2) | (e2 >> 4);        var c2 = ((e2 & 15) << 4) | (e3 >> 2);        var c3 = ((e3 & 3) << 6) | e4;        hex += hexDigits[c1 >> 4];        hex += hexDigits[c1 & 15];        if (e3 != 64) {            hex += hexDigits[c2 >> 4];            hex += hexDigits[c2 & 15];        }        if (e4 != 64) {            hex += hexDigits[c3 >> 4];            hex += hexDigits[c3 & 15];        }    }    return hex;}function UUID(uuid) {    var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters    var base64 = HexToBase64(hex);    return new BinData(4, base64); // new subtype 4}function JUUID(uuid) {    var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters    var msb = hex.substr(0, 16);    var lsb = hex.substr(16, 16);    msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);    lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);    hex = msb + lsb;    var base64 = HexToBase64(hex);    return new BinData(3, base64);}function CSUUID(uuid) {    var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);    var b = hex.substr(10, 2) + hex.substr(8, 2);    var c = hex.substr(14, 2) + hex.substr(12, 2);    var d = hex.substr(16, 16);    hex = a + b + c + d;    var base64 = HexToBase64(hex);    return new BinData(3, base64);}function PYUUID(uuid) {    var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters    var base64 = HexToBase64(hex);    return new BinData(3, base64);}BinData.prototype.toUUID = function () {    var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs in older versions of the shell    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);    return 'UUID("' + uuid + '")';}BinData.prototype.toJUUID = function () {    var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs in older versions of the shell    var msb = hex.substr(0, 16);    var lsb = hex.substr(16, 16);    msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);    lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);    hex = msb + lsb;    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);    return 'JUUID("' + uuid + '")';}BinData.prototype.toCSUUID = function () {    var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs in older versions of the shell    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);    var b = hex.substr(10, 2) + hex.substr(8, 2);    var c = hex.substr(14, 2) + hex.substr(12, 2);    var d = hex.substr(16, 16);    hex = a + b + c + d;    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);    return 'CSUUID("' + uuid + '")';}BinData.prototype.toPYUUID = function () {    var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);    return 'PYUUID("' + uuid + '")';}BinData.prototype.toHexUUID = function () {    var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);    return 'HexData(' + this.subtype() + ', "' + uuid + '")';}
View Code

仓储层的调用:

using KuRuMi.Mio.DoMain.Model.Model;using KuRuMi.Mio.DoMain.Model.Repositories;using KuRuMi.Mio.DoMain.Repository.EFRepository;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace KuRuMi.Mio.DoMain.Repository.ModelRepository{    public class UserRepositoryImpl : RepositoryImpl
, IUserRepository { public KurumiMioDbContext context => lazy.Context as KurumiMioDbContext; ///
/// 登录 /// ///
///
///
public string CheckUser(string Email, string PassWord) { try { User entity = null; //MongoDb取 entity = Mongo.FindSingleIndex
(a => a.Email == Email); if (entity == null) { //redis取 entity = Redis.RedisString.Value.StringGet
(Email); } if (entity == null) { //数据库取 string sql = "select Id,UserName,Password,email from [User] as a where a.Email ='{0}' and a.PassWord ='{1}'"; string select = string.Format(sql, Email, PassWord); entity = context.user.SqlQuery(select).FirstOrDefault(); } return entity.UserName; } catch (Exception e) { return ""; } } ///
/// 保存 /// ///
public async override void Add(User aggregateRoot) { base.Add(aggregateRoot); await Redis.RedisString.Value.StringSetAsync(aggregateRoot.Email, aggregateRoot);//保存一份到redis Mongo.AddSignleObjectAsync(aggregateRoot);//保存一份到mongoDb } ///
/// 注册 /// ///
///
public User GetAll(User info) { string sql = "select Id,UserName,Password,email from [User] as a where a.UserName ='{0}' and email ='{1}'"; string select = string.Format(sql, info.UserName, info.Email); return context.user.SqlQuery(select).FirstOrDefault(); } }}
View Code

 图1:

图2:

图3:

图4:

图5:

 

图6:

图7:

图8:

图9:

转载于:https://www.cnblogs.com/edna-lzh/p/6972661.html

你可能感兴趣的文章
POJ-3211 Washing Clothes[01背包问题]
查看>>
[BZOJ4832][Lydsy1704月赛]抵制克苏恩
查看>>
数据库三范式
查看>>
看完漫画秒懂区块链
查看>>
开发工具,做一个有效率的开发者
查看>>
对Haskell这门语言的基本认识
查看>>
mysql 安装补充
查看>>
大学里如何学习 ?
查看>>
Oracle命令类别
查看>>
js面试题:关于数组去重的四种方法总结
查看>>
Linux内核分析(三)----初识linux内存管理子系统
查看>>
stc12c5a60s2驱动TEA5767收音机模块硬件调试总结
查看>>
vue中提示$index is not defined
查看>>
Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码
查看>>
css选择器
查看>>
看懂下面C++代码才说你理解了C++多态虚函数!
查看>>
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>
Mob-第三方分享 /手机验证码
查看>>
Spring中使用Velocity模板
查看>>