Dette er et eksempel på, hvordan 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);
OPDATERING
Med hensyn til indeks inden for arrayet, det nærmeste jeg kunne finde er at bruge "-1" som indeks, når du bygger din indeksnøgle. Som jeg forstår fra github, er kildekoden en gyldig mulighed i tilfælde af bygningsforespørgsler.
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" er en hårdkodet konstant i side-mongodb C#-drivere, hvilket betyder "$" (bevis ). Så denne kode ville forsøge at oprette indeks:
{ "Key1": 1, "Key2.$.Key": 1 }
hvilket er fint til at forespørge info fra databasen, men ikke tilladt (vil kaste en undtagelse "Indeksnøgle indeholder et ulovligt feltnavn:feltnavn starter med '$'") til brug i indekser. Så jeg antager, at det skal ændres i mongodb-drivere for at få det til at fungere. Noget som "-2" betyder tom operator. I så fald kunne vi bruge
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);
hvilket ville generere indeks som:
{ "Key1": 1, "Key2.Key": 1 }
Så dybest set tror jeg ikke, det er muligt lige nu at bygge det indeks, du ønsker med ren Linq uden at ændre mongo C#-drivere.
Så jeg tror, at din eneste mulighed gør sådan her, stadig C#, men uden Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});