Este es un ejemplo de cómo hacerlo con 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);
ACTUALIZAR
Con respecto al índice dentro de la matriz, lo más cercano a lo que pude encontrar es usar "-1" como índice cuando crea su clave de índice. Según entiendo por el código fuente de github, es una opción válida en caso de consultas de creación.
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" es una constante codificada en los controladores C# de mongodb que significa "$" (prueba ). Entonces este código intentaría crear un índice:
{ "Key1": 1, "Key2.$.Key": 1 }
lo cual está bien para consultar información de la base de datos, pero no está permitido (arrojará una excepción "La clave de índice contiene un nombre de campo ilegal:el nombre de campo comienza con '$'") para usar en índices. Así que supongo que debería cambiarse en los controladores mongodb para que funcione. Algo así como "-2" significa operador vacío. En ese caso podrí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 generaría un índice como:
{ "Key1": 1, "Key2.Key": 1 }
Así que, básicamente, no creo que sea posible en este momento crear el índice que desee con Linq puro sin cambiar los controladores mongo C#.
Así que creo que tu única opción es hacer esto, todavía C# pero sin Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});