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

Driver C# MongoDB:Não é possível encontrar a maneira de executar uma consulta complexa para o filtro AnyIn no MongoDB


não faça isso :)

Um lugar onde você pode começar é aqui . Ele descreve todos os operadores LINQ que são suportados pelo driver MongoDB .NET. Como você pode ver .Contains() não é mencionado lá, o que significa que você não pode usá-lo e obterá uma erro no tempo de execução, mas isso não significa que não há como fazer o que você está tentando alcançar.

O operador mais próximo do conteúdo que você pode usar é $indexOfBytes que retorna -1 se não houver correspondência e a posição de uma substring, caso contrário. Além disso, como você precisa combinar um array com outro array, você precisa de dois pares de $map e $anyElementTrue para fazer exatamente o que o .Any do .NET faz.

Sua consulta (cliente MongoDB) pode ficar assim:
db.collection.find({
    $expr: {
        $anyElementTrue: {
            $map: {
                input: "$groupsAuthorized",
                as: "group",
                in: {
                    $anyElementTrue: {
                        $map: { 
                            input: ["France/IDF/Paris", "USA/NY/NYC"],
                            as: "userGroup",
                            in: { $ne: [ -1, { $indexOfBytes: [ "$$userGroup", "$$group" ] } ] }
                        }
                    }
                }
            }
        }
    }
})

Mongo Playground ,

Você pode executar a mesma consulta do .NET usando BsonDocument class que recebe uma string (JSON) e converte em uma consulta:
var query = BsonDocument.Parse(@"{
    $expr: {
        $anyElementTrue:
        {
            $map:
            {
                input: '$groupsAuthorized',
                    as: 'group',
                    in: {
                    $anyElementTrue:
                    {
                        $map:
                        {
                            input: ['France/IDF/Paris', 'USA/NY/NYC'],
                                as: 'userGroup',
                                in: { $ne: [-1, { $indexOfBytes: ['$$userGroup', '$$group'] } ] }
                        }
                    }
                }
            }
        }
    }
}");

var result = col.Find(query).ToList();