MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como criar o índice MongoDB MultiKey no atributo de itens em um array .NET Driver


Este é um exemplo de como fazer isso com 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); 

ATUALIZAÇÃO

Em relação ao índice dentro do array, o mais próximo que consegui encontrar é usar "-1" como índice ao construir sua chave de índice. Pelo que entendi do código-fonte do github, é uma opção válida no caso de criar consultas.
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" é uma constante codificada nos drivers laterais do mongodb C# que significa "$" (prova ). Portanto, este código tentaria criar o índice:
{ "Key1": 1, "Key2.$.Key": 1 }

o que é bom para consultar informações do banco de dados, mas não permitido (irá lançar uma exceção "Chave de índice contém um nome de campo ilegal:o nome do campo começa com '$'") para usar em índices. Então, eu suponho que deve ser alterado nos drivers do mongodb para que funcione. Algo como "-2" significa operador vazio. Nesse caso poderí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 geraria um índice como:
{ "Key1": 1, "Key2.Key": 1 }

Então, basicamente, eu não acho que seja possível agora construir o índice que você deseja com puro Linq sem alterar os drivers do mongo C#.

Então eu acho que sua única opção é assim, ainda C # mas sem Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});