Questo è un esempio di come farlo 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);
AGGIORNAMENTO
Per quanto riguarda l'indice all'interno dell'array, il più vicino a ciò che sono riuscito a trovare è usare "-1" come indice durante la creazione della chiave dell'indice. Come ho capito dal codice sorgente di github, è un'opzione valida in caso di creazione di query.
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" è una costante codificata nei driver C# mongodb laterali che significa "$" (prova ). Quindi questo codice proverebbe a creare l'indice:
{ "Key1": 1, "Key2.$.Key": 1 }
che va bene per la query di informazioni dal database, ma non consentito (genera un'eccezione "La chiave di indice contiene un nome di campo illegale:il nome di campo inizia con '$'") da utilizzare negli indici. Quindi presumo che dovrebbe essere cambiato nei driver mongodb per farlo funzionare. Qualcosa come "-2" significa operatore vuoto. In tal caso potremmo usare
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);
che genererebbe un indice come:
{ "Key1": 1, "Key2.Key": 1 }
Quindi in pratica non credo sia possibile in questo momento creare l'indice desiderato con Linq puro senza modificare i driver mongo C#.
Quindi penso che la tua unica opzione faccia così, ancora C# ma senza Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});