MongoDB 创建索引 及 Count查询 C#

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

MongoDB 创建索引,需要引入第三方DLL文件:mongocsharpdriver ,这个可以通过NuGet来完成

Mongodb 在百万条数据时,查询性能就会很低,我公司的数据库当数据量达到400万条数据时,查询大概需要10秒左右时间,这显然是不能接收的,那么我们通过建立MongoDB 索引来解决。

 目前公司的体量是近370万条数据,随着将来物联网设备的增加,那么将来很可能会突破上亿条。

实战的结果是:加了索引后,查询性能显著提高,提高了几十倍,由原来的10秒变成了400毫秒不到。

当然,如果你的数据表中只有很少的数据。例如十万条数据。或者十万级以下,在这种情况下建立索引对性能的提升不大显著。

C# 建立索引代码如下:

        [Obsolete]
        public static void CreateBatteryHeartIndex()
        {
            var DatabaseName = new Battery2gHeartService().GetBatteryHeartDataBaseName();
            LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.MongoDb2gBatteryEnm.BatteryHeart2gData.ToString(), DatabaseName = DatabaseName };
            var client = new MongoClient(settings.ConnectionString);

            MongoDatabase mongoDatabase = client.GetServer().GetDatabase(settings.DatabaseName);
            var datacollection = mongoDatabase.GetCollection(settings.LogsCollectionName);
            var allindex = datacollection.GetIndexes();
            ///BatterySN_1_BmsStatus_1_CreateTime_-1_SOC_1
            if (!datacollection.IndexExistsByName("BatterySN_1_BmsStatus_1_CreateTime_-1_SOC_1"))
            {
                var as_index = new IndexKeysBuilder();
                as_index.Ascending("BatterySN");
                as_index.Ascending("BmsStatus");
                as_index.Descending("CreateTime");
                as_index.Ascending("SOC");
                datacollection.CreateIndex(as_index);
            }

        }

执行上述代码,建立的索引如下:

该方法针对建立的索引的命名规则为:名称加下划线加正序/倒序

其中正序为1 倒序为-1

因此:上述代码中的索引名称为:BatterySN_1_BmsStatus_1_CreateTime_-1_SOC_1

除了建立查询索引,它还支持建立其他索引,譬如:唯一性索引:unique,等

具体可参考:https://blog.csdn.net/chym18845095620/article/details/101033765  和 https://www.cnblogs.com/chenzibai/p/14719430.html

下面简单看下MongoDB linq查询的计数问题

这个没什么好说的,代码如下:

        public BaseResponse<ExbatModel> SearchExbatPercentage(ReadCabinetIotLogModel data)
        {
            CabinetIotLogModel cabinet = new CabinetIotLogModel();
            LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.MongoDbnameEnm.IotLogs.ToString(), DatabaseName = DatabaseName + DateTime.Now.ToString("yyyyMMdd") };
            if (!string.IsNullOrEmpty(data.TbDate))
            {
                settings.DatabaseName = DatabaseNamePrefix + Convert.ToDateTime(data.TbDate).ToString("yyyyMMdd");
            }
            var client = new MongoClient(settings.ConnectionString);
            var database = client.GetDatabase(settings.DatabaseName);

            var Mongo = database.GetCollection<IotLogs>(settings.LogsCollectionName);
            ExbatModel model = new ExbatModel();
            model.TotalExbattRequest = Mongo.AsQueryable().Count(A => A.MethodName == "exbattrequest");
            model.SuccessExbatt = Mongo.AsQueryable().Count(A => A.MethodName == "exbatt" && A.Rst == 0);
            model.ExbattCmdFiled = Mongo.AsQueryable().Count(A => A.MethodName == "exbatt" && A.Rst != 0);
            return CommonBaseResponse.SetResponse<ExbatModel>(model,true);
        }

 计数Count的性能在此不多说。

@天才卧龙的博客

原文地址:https://www.cnblogs.com/chenwolong/p/15026544.html