还是一如既往先把结构图放出来,上上个版本添加了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();
        /// <summary>
        /// 使用单列模式创建连接
        /// </summary>
        /// <returns></returns>
        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

相关文章: