首页 > 解决方案 > 如何检查 MongoDB C# 中的索引(是否存在),因为 IndexExist 已从较新版本中弃用

问题描述

我刚刚将旧的 MongoDB C# 驱动程序更新为2.7.3版本,从 nuget 包更新它后,我得到了很多错误行

EnsureIndex 未定义

IndexExists 未定义

ping 未定义

getServer 未定义

他们的更新文档或文档也是如此,它将解释如何使用较新版本获取这些文档。

var connectionString = string.Format("mongodb://{0}:{1}", mongoServerInstance.Address.Host, mongoServerInstance.Address.Port);
            connectionString = ReplaceHostNames(connectionString);
            _logger.Debug("checking for indexes on server, {0}", mongoServerInstance.Address.Host);
            var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
            settings.ConnectionMode = ConnectionMode.Direct;
            settings.ReadPreference = ReadPreference.SecondaryPreferred;
            var mongoClient = new MongoClient(settings);
            var listMongo = mongoClient.ListDatabases();
            var server = mongoClient.GetServer();

            foreach (var index in MongoRepositoryConfiguration.Indexes)
            {
                var mongoDataBase = mongoClient.GetDatabase(index.DatabaseName);

                if (!mongoClient.GetDatabase(index.DatabaseName)
                            .GetCollection<BsonDocument>(index.CollectionName)
                            .IndexExists(index.MongoIndexKeys))
                {
                    if (index.IndexName != "")
                    {
                        if (!mongoClient.GetDatabase(index.DatabaseName)
                                   .GetCollection<BsonDocument>(index.CollectionName)
                                   .IndexExistsByName(index.IndexName))
                        {
                            AddIndexToList(index, nonExistentIndexes);
                        }
                    }
                    else
                    {
                        AddIndexToList(index, nonExistentIndexes);
                    }
                }
            }

            server.Disconnect();

标签: c#mongodb

解决方案


collection.Indexes.List()在 2.x 驱动程序中,您可以通过该方法获取给定集合的索引的详细信息。这是一个使用MongoDB.Entities创建两个索引并获取它们的名称的示例[免责声明:我是作者]

using MongoDB.Entities;
using MongoDB.Driver;
using System;

namespace StackOverflow
{
    public class Program
    {
        public class User : Entity
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int Age { get; set; }
        }

        static void Main(string[] args)
        {
            new DB("test");

            DB.Index<User>()
              .Key(u => u.FirstName, KeyType.Text)
              .Key(u => u.LastName, KeyType.Text)
              .Create();

            DB.Index<User>()
              .Key(u => u.Age, KeyType.Ascending)
              .Create();

            var indexes = DB.Collection<User>().Indexes.List().ToList();

            foreach (var index in indexes)
            {
                Console.WriteLine(index.GetElement("name"));
            }

            Console.Read();
        }
    }
}

推荐阅读