MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment créer un index MongoDB MultiKey sur l'attribut des éléments d'un tableau Pilote .NET

Ceci est un exemple de comment le faire avec 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); 

MISE À JOUR

En ce qui concerne l'index dans le tableau, le plus proche de ce que j'ai pu trouver est d'utiliser "-1" comme index lorsque vous construisez votre clé d'index. D'après ce que je comprends du code source de github, c'est une option valide en cas de création de requêtes.

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" est une constante codée en dur dans les pilotes côté mongodb C# qui signifie "$" (preuve ). Donc ce code essaierait de créer un index :

{ "Key1": 1, "Key2.$.Key": 1 }

ce qui convient pour interroger les informations de la base de données, mais n'est pas autorisé (lèvera une exception "La clé d'index contient un nom de champ illégal :le nom du champ commence par '$'") à utiliser dans les index. Je suppose donc qu'il devrait être modifié dans les pilotes mongodb pour que cela fonctionne. Quelque chose comme "-2" signifie un opérateur vide. Dans ce cas, nous pourrions utiliser

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

qui générerait un index comme :

{ "Key1": 1, "Key2.Key": 1 }

Donc, fondamentalement, je ne pense pas qu'il soit possible pour le moment de créer l'index que vous voulez avec Linq pur sans changer les pilotes mongo C#.

Donc je pense que votre seule option fait comme ça, toujours C# mais sans Linq

await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});