如何使用C#驱动程序从现有索引中创建Mongo索引定义?

时间:2019-06-18 15:10:08

标签: c# .net mongodb mongodb-.net-driver

我正在尝试从一个集合为另一个集合重新创建索引。

我可以通过以下方式从源集合中获取现有索引:

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 个答案:

答案 0 :(得分:2)

如果您要运行像targetCollection.Indexes.CreateOne()这样的强类型.NET驱动程序API,会变得有些麻烦,因为它要求将选项指定为CreateIndexOptions类型,并期望像Sparse这样的所有选项或以强类型方式指定的Unique

或者,您可以使用createIndexes数据库命令创建多个索引。要从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)
    }
});