Oto przykład, jak to zrobić za pomocą 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);
AKTUALIZUJ
Jeśli chodzi o indeks w tablicy, najbliżej tego, co udało mi się znaleźć, jest użycie "-1" jako indeksu podczas budowania klucza indeksu. Jak rozumiem z kodu źródłowego github jest to poprawna opcja w przypadku budowania zapytań.
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” to zakodowana stała w bocznych sterownikach mongodb C#, co oznacza „$” (dowód ). Więc ten kod próbowałby utworzyć indeks:
{ "Key1": 1, "Key2.$.Key": 1 }
co jest dobre dla zapytań o informacje z bazy danych, ale niedozwolone (zgłosi wyjątek "Klucz indeksu zawiera nieprawidłową nazwę pola:nazwa pola zaczyna się od '$'") do użycia w indeksach. Więc zakładam, że należy to zmienić w sterownikach mongodb, aby działało. Coś w rodzaju „-2” oznacza pusty operator. W takim przypadku moglibyśmy użyć
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);
który wygenerowałby indeks taki jak:
{ "Key1": 1, "Key2.Key": 1 }
Więc zasadniczo nie sądzę, aby w tej chwili możliwe było zbudowanie pożądanego indeksu za pomocą czystego Linqa bez zmiany sterowników mongo C#.
Więc myślę, że twoja jedyna opcja to zrobić tak, nadal C#, ale bez Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});