Как я могу создать определение индекса Mongo из существующего, используя драйвер C #? - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь воссоздать индексы из одной коллекции для другой.

Я могу получить существующий индекс из исходной коллекции:

var sourceCollectionName = "source";
var targetCollectionName = "target";

var sourceCollection = db.GetCollection<BsonDocument>(sourceCollectionName);
var targetCollection = db.GetCollection<BsonDocument>(targetCollectionName);

List<BsonDocument> sourceCollectionIndexes = await(await sourceCollection.Indexes.ListAsync()).ToListAsync();

Но я не могу понять, куда идтиоттуда.

1 Ответ

2 голосов
/ 18 июня 2019

Это становится немного громоздким, если вы хотите запускать строго типизированный API-драйвер .NET, такой как targetCollection.Indexes.CreateOne(), так как он требует, чтобы параметры были определены как CreateIndexOptions тип, который предполагает, что все параметры, такие как Sparse или Unique, будут указано строго типизированным способом.

В качестве альтернативы вы можете создать несколько индексов, используя команду createIndexes database. Чтобы запустить его из C #, вы можете удалить ns из полученного BsonDocuments, поскольку пространство имен будет другим, а затем передать все ваши определения этой команде. Попробуйте:

var sourceCollectionName = "source";
var targetCollectionName = "target";

var sourceCollection = Db.GetCollection<BsonDocument>(sourceCollectionName);

List<BsonDocument> sourceCollectionIndexes = await (await sourceCollection.Indexes.ListAsync()).ToListAsync();

foreach(var indexDef in sourceCollectionIndexes)
{
    indexDef.Remove("ns");
}

await Db.RunCommandAsync<BsonDocument>(new BsonDocument()
{
    { "createIndexes", targetCollectionName },
    {
        "indexes", new BsonArray(sourceCollectionIndexes)
    }
});
...