Detta är ett exempel på hur man gör det med 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);
UPPDATERA
När det gäller index inom arrayen, det närmaste jag kunde hitta är att använda "-1" som index när du bygger din indexnyckel. Som jag förstår från github är källkoden ett giltigt alternativ vid byggnadsfrågor.
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" är en hårdkodad konstant i mongodb C#-drivrutiner som betyder "$" (bevis ). Så den här koden skulle försöka skapa index:
{ "Key1": 1, "Key2.$.Key": 1 }
vilket är bra för att söka information från databasen, men inte tillåtet (kommer att ge ett undantag "Indexnyckel innehåller ett olagligt fältnamn:fältnamnet börjar med '$'") att använda i index. Så jag antar att det borde ändras i mongodb-drivrutiner för att det ska fungera. Något som "-2" betyder tom operator. I så fall skulle vi kunna använda
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);
vilket skulle generera index som:
{ "Key1": 1, "Key2.Key": 1 }
Så i grund och botten tror jag inte att det är möjligt just nu att bygga index du vill ha med ren Linq utan att byta mongo C#-drivrutiner.
Så jag tror att ditt enda alternativ gör så här, fortfarande C# men utan Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});