Как удалить индекс, не зная его имени?

#c# #.net #mongodb #indexing

#c# #.net #mongodb #индексирование

Вопрос:

Я хочу удалить индекс с помощью драйвера MongoDB .NET (v.2.11). Проблема в том, что я не хочу использовать имя индекса, вместо этого я хотел бы удалить его, как в: https://docs.mongodb.com/manual/tutorial/manage-indexes/Remove Конкретный раздел индекса — предоставление схемы индекса. Как это можно сделать? Теперь с помощью:

MyCollection.Indexes.DropOne("{ _id: 1, somefield: 1 }");

приводит к:

MongoDB.Driver.MongoCommandException: 'Command dropIndexes failed: index not found with name [{ _id: 1, somefield: 1 }].'

Примечание: индекс существует в коллекции.

Комментарии:

1. Я не думаю, что это возможно. Не уверен в точном варианте использования, но вы могли бы перебирать индексы, находить тот, который вам нужен, а затем удалять его по имени?

Ответ №1:

В настоящее время в драйвере C # нет способа удалить индекс на основе его ключей.

Однако вы можете выполнить поиск по индексу и получить имя, а затем удалить индекс следующим образом.

 var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<Person>("people");

// Create a index
var keys = Builders<Person>.IndexKeys.Ascending(x => x.Surname);
await collection.Indexes.CreateOneAsync(new CreateIndexModel<Person>(keys));

var cursor = await collection.Indexes.ListAsync();

// Find the index 
var indexKeys = BsonDocument.Parse("{ Surname: 1 }");
var indexName = (await cursor.ToListAsync())
    .Where(x => x["key"] == indexKeys)
    .Select(x => x["name"])
    .Single();

// Drop index by name
await collection.Indexes.DropOneAsync(indexName.AsString);
  

Ответ №2:

Команда dropIndex поддерживает предоставление спецификации индекса. Вы можете вызвать его с помощью помощника вашего драйвера для выполнения произвольных команд, если ваш драйвер не предоставляет помощника dropIndex, который принимает спецификацию индекса.

MyCollection.Индексы.DropOne(«{ _id: 1, somefield: 1 }»);

Вы пытались удалить индекс с именем "{ _id: 1, somefield: 1 }" . Как минимум, вы должны использовать правильный синтаксис для maps на вашем языке программирования.

Комментарии:

1. Я знаю, что это работает, что драйвер C # работает таким образом, так как я искал какое-то решение 🙂