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

Controlador C# MongoDB:no se puede encontrar la manera de ejecutar una consulta compleja para el filtro AnyIn en MongoDB

no lo hagas :)

Un lugar con el que puede comenzar es aquí . Describe todos los operadores LINQ que son compatibles con el controlador MongoDB .NET. Como puedes ver .Contains() no se menciona allí, lo que significa que no puede usarlo y obtendrá un error en el tiempo de ejecución, pero no significa que no haya forma de hacer lo que está tratando de lograr.

El operador más cercano a contains que puede usar es $indexOfBytes que devuelve -1 si no hay coincidencia y la posición de una subcadena de lo contrario. Además, dado que necesita hacer coincidir una matriz con otra matriz, necesita dos pares de $mapa y $anyElementTrue para hacer exactamente lo que .Any de .NET lo hace.

Su consulta (cliente MongoDB) puede verse así:

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" ] } ] }
                        }
                    }
                }
            }
        }
    }
})

Patio de juegos Mongo ,

Puede ejecutar la misma consulta desde .NET usando BsonDocument clase que toma una cadena (JSON) y la convierte en una 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();