0
votes

Comment comparer la chaîne dans mongodb si elle est en minuscule ou en majuscule

Je travaille sur un projet de mern et sur la connexion de l'utilisateur, je trouve cet utilisateur comme celui-ci:

user.findone ({nom d'utilisateur: req.body.username}). Exec (fonction (err, utilisateur) { Si (utilisateur) { Lignes de code .... });

Imaginez que mon nom d'utilisateur est IMran enregistré dans dB et envoyez le nom d'utilisateur dans le code ci-dessus comme.

Case1: req.body.username = imran Utilisateur trouvé 1

cas2: req.body.username = imran Utilisateur trouvé 0

Case3: req.body.username = imran Utilisateur trouvé 0

Si j'utilise regex pour trouver le nom d'utilisateur comme ceci ...

user.findone ({nom d'utilisateur: {$ regex: nom d'utilisateur, $ options: "i"}})

Il trouvera l'utilisateur dans tout le cas ci-dessus, mais si je tape IMR plutôt que IMRan ou Imran ou Imran avec mot de passe indiqué, il se connectera à nouveau cet utilisateur qui n'est pas correct! Donc j'espère. Si quelqu'un pouvait m'aider avec la question! Ça va être génial!


1 commentaires

Pourriez-vous s'il vous plaît expliquer que souhaitez-vous faire avec le champ Nom d'utilisateur? AFAIK, le MongoDB validerait votre nom d'utilisateur uniquement pour le cas 1 et cela devrait être le seul cas. Si vous avez l'intention de remplir automatiquement ou de toute autre action, il est préférable de le faire effectuer dans les couches supérieures plutôt que de votre DB afin de minimiser votre fardeau sur la performance.


3 Réponses :


1
votes

Vous voudriez normaliser les données lorsque vous l'enregistrez en appelant nom d'utilisateur.tolowercase () (ou touppercase () ). Ensuite, lorsque vous exécutez la requête, vous appelleriez user.findone ({nom d'utilisateur: req.body.username.tolowercase ()})


3 commentaires

Je seconde cette suggestion. C'est généralement une mauvaise pratique de ne pas assainir l'entrée de l'utilisateur et de les stocker directement dans votre base de données. Sauf si vous avez l'intention d'autoriser un nom d'utilisateur mixte, vous devez assainir vos intrants.


Je ne suis pas complètement d'accord. Et si le boîtier est réellement important? Comme sur les noms? Pourquoi sauveriez-vous des données mises en charge?


@Juanmanuelhaedo Vous ne voudriez certainement que normaliser les données de cette manière si le boîtier n'est pas important. Par exemple, les adresses électroniques sont insensibles à la casse. Pour les champs sensibles à la casse, vous devez utiliser une recherche insensible à la caisse $ REGEX, ou vous pourriez avoir un champ dupliqué normalisé à tous les minuscules pour les recherches insensibles de cas.



1
votes

Je recommanderais de stocker au moins les noms d'utilisateur minuscules que vous souhaitez différencier les noms d'utilisateur inférieurs et majuscules, si tel est le cas, imran code> et imran code> sont deux utilisateurs différents. De toute façon, pour correspondre à la requête insensible à casse, vous pouvez essayer ceci:

User.findOne({username: {$regex: '^imran$', $options: 'i'}})


2 commentaires

Comment puis-je donner une valeur dynamique autre que Imran! Je fais comme ça .. user.findone ({nom d'utilisateur: / ^ nom d'utilisateur $ / i}) ... mais ne fonctionne pas


Essayez avec: user.findone ({nom d'utilisateur: {$ regex: '^ imran $', $ options: 'i'}}) , je vais éditer



0
votes

Merci tout pour l'aide! J'ai trouvé la solution qui fonctionne pour moi. User.findone ({nom d'utilisateur: nouveau Regexp ("\ b" + nom d'utilisateur + "\ b", "i")} .... Cela correspondra à la chaîne de nom d'utilisateur si si elle est en minuscule ou en majuscule. J'espère que cela vous aide :)


0 commentaires