我正在尝试从一个集合为另一个集合重新创建索引。
我可以通过以下方式从源集合中获取现有索引:
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();
但是我不知道该去哪里。
答案 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)
}
});