MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So erstellen Sie einen MongoDB MultiKey-Index für Attribute von Elementen in einem Array .NET-Treiber

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

verwenden
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); 

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}});