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

Pilote C# MongoDB :Impossible de trouver le moyen d'exécuter une requête complexe pour le filtre AnyIn dans MongoDB

ne le fais pas :)

Un endroit par lequel vous pouvez commencer est ici . Il décrit tous les opérateurs LINQ pris en charge par le pilote MongoDB .NET. Comme vous pouvez le voir .Contains() n'est pas mentionné ici, ce qui signifie que vous ne pouvez pas l'utiliser et que vous obtiendrez une erreur lors de l'exécution, mais cela ne signifie pas qu'il n'y a aucun moyen de faire ce que vous essayez d'accomplir.

L'opérateur le plus proche de contient que vous pouvez utiliser est $indexOfBytes qui renvoie -1 s'il n'y a pas de correspondance et la position d'une sous-chaîne sinon. De plus, puisque vous devez faire correspondre un tableau à un autre tableau, vous avez besoin de deux paires de $carte et $anyElementTrue pour faire exactement ce que le .Any de .NET Est-ce que.

Votre requête (client MongoDB) peut ressembler à ceci :

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 ,

Vous pouvez exécuter la même requête à partir de .NET en utilisant BsonDocument classe qui prend une chaîne (JSON) et la convertit en une requête :

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