Este é um exemplo de como fazer isso com C#
var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2));
await collection.Indexes.CreateOneAsync(indexDefinition);
ATUALIZAÇÃO
Em relação ao índice dentro do array, o mais próximo que consegui encontrar é usar "-1" como índice ao construir sua chave de índice. Pelo que entendi do código-fonte do github, é uma opção válida no caso de criar consultas.
var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2[-1].Key));
await collection.Indexes.CreateOneAsync(indexDefinition);
"-1" é uma constante codificada nos drivers laterais do mongodb C# que significa "$" (prova ). Portanto, este código tentaria criar o índice:
{ "Key1": 1, "Key2.$.Key": 1 }
o que é bom para consultar informações do banco de dados, mas não permitido (irá lançar uma exceção "Chave de índice contém um nome de campo ilegal:o nome do campo começa com '$'") para usar em índices. Então, eu suponho que deve ser alterado nos drivers do mongodb para que funcione. Algo como "-2" significa operador vazio. Nesse caso poderíamos usar
var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2[-2].Key));
await collection.Indexes.CreateOneAsync(indexDefinition);
que geraria um índice como:
{ "Key1": 1, "Key2.Key": 1 }
Então, basicamente, eu não acho que seja possível agora construir o índice que você deseja com puro Linq sem alterar os drivers do mongo C#.
Então eu acho que sua única opção é assim, ainda C # mas sem Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});