Dies ist ein Beispiel, wie man es mit C# macht
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);
AKTUALISIEREN
In Bezug auf den Index innerhalb des Arrays konnte ich am ehesten "-1" als Index verwenden, wenn Sie Ihren Indexschlüssel erstellen. Wie ich aus dem Github-Quellcode verstehe, ist dies eine gültige Option beim Erstellen von Abfragen.
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“ ist eine hartcodierte Konstante in seitlichen Mongodb-C#-Treibern, was „$“ bedeutet (Beweis ). Dieser Code würde also versuchen, den Index zu erstellen:
{ "Key1": 1, "Key2.$.Key": 1 }
Dies ist in Ordnung, um Informationen aus der Datenbank abzufragen, aber nicht zulässig (wirft eine Ausnahme "Indexschlüssel enthält einen ungültigen Feldnamen:Feldname beginnt mit '$'") zur Verwendung in Indizes. Ich gehe also davon aus, dass es in Mongodb-Treibern geändert werden sollte, damit es funktioniert. So etwas wie "-2" bedeutet leerer Operator. In diesem Fall könnten wir
verwendenvar 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);
was einen Index erzeugen würde wie:
{ "Key1": 1, "Key2.Key": 1 }
Im Grunde genommen glaube ich nicht, dass es derzeit möglich ist, den gewünschten Index mit reinem Linq zu erstellen, ohne die Mongo-C#-Treiber zu ändern.
Ich denke also, Ihre einzige Option ist dies, immer noch C#, aber ohne Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});