sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo crear el índice MongoDB MultiKey en el atributo de los elementos en un controlador .NET de matriz

Este es un ejemplo de cómo hacerlo 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); 

ACTUALIZAR

Con respecto al índice dentro de la matriz, lo más cercano a lo que pude encontrar es usar "-1" como índice cuando crea su clave de índice. Según entiendo por el código fuente de github, es una opción válida en caso de consultas de creación.

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" es una constante codificada en los controladores C# de mongodb que significa "$" (prueba ). Entonces este código intentaría crear un índice:

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

lo cual está bien para consultar información de la base de datos, pero no está permitido (arrojará una excepción "La clave de índice contiene un nombre de campo ilegal:el nombre de campo comienza con '$'") para usar en índices. Así que supongo que debería cambiarse en los controladores mongodb para que funcione. Algo así como "-2" significa operador vacío. En ese caso podríamos usar

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

que generaría un índice como:

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

Así que, básicamente, no creo que sea posible en este momento crear el índice que desee con Linq puro sin cambiar los controladores mongo C#.

Así que creo que tu única opción es hacer esto, todavía C# pero sin Linq

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