MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come creare l'indice MongoDB MultiKey sull'attributo degli elementi in un driver .NET di array

Questo è un esempio di come farlo con 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); 

AGGIORNAMENTO

Per quanto riguarda l'indice all'interno dell'array, il più vicino a ciò che sono riuscito a trovare è usare "-1" come indice durante la creazione della chiave dell'indice. Come ho capito dal codice sorgente di github, è un'opzione valida in caso di creazione di query.

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" è una costante codificata nei driver C# mongodb laterali che significa "$" (prova ). Quindi questo codice proverebbe a creare l'indice:

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

che va bene per la query di informazioni dal database, ma non consentito (genera un'eccezione "La chiave di indice contiene un nome di campo illegale:il nome di campo inizia con '$'") da utilizzare negli indici. Quindi presumo che dovrebbe essere cambiato nei driver mongodb per farlo funzionare. Qualcosa come "-2" significa operatore vuoto. In tal caso potremmo usare

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

che genererebbe un indice come:

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

Quindi in pratica non credo sia possibile in questo momento creare l'indice desiderato con Linq puro senza modificare i driver mongo C#.

Quindi penso che la tua unica opzione faccia così, ancora C# ma senza Linq

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