Le filtrage des champs de chaîne dans Mongodb est sensible à la casse sans utiliser d'expressions régulières. Pourquoi exactement vous ne pouvez pas utiliser d'expressions régulières ?
Votre requête peut être modifiée comme suit :
var filter = Builders<ME_User>.Filter.And(
Builders<ME_User>.Filter.Regex(u => u.Email, new BsonRegularExpression("/^" + email + "$/i"),
Builders<ME_User>.Filter.Eq(u => u.Password, password));
Remarquez les signes "^" et "$" pour spécifier une recherche de mot complète et surtout l'opérateur insensible à la casse à la fin de l'expression régulière ("/i").
Une autre méthode serait la recherche de texte, qui nécessite la création d'un index de texte et est insensible à la casse pour l'alphabet latin :http://docs.mongodb.org/manual/reference/operator/query/text/#match-operation
En C#, vous utiliserez avec le Filtre Texte :
var filter = Builders<ME_User>.Filter.And(
Builders<ME_User>.Filter.Text(email),
Builders<ME_User>.Filter.Eq(u => u.Password, password));
Avec une requête d'index de texte dans une clause OR, vous devrez également créer un index sur le champ Mot de passe, sinon la requête OR produira une erreur :