2012-08-08 12 views
8

Kodowanie usługi internetowej, w której użytkownicy mogą wybrać nazwę użytkownika, która ma być niewrażliwy na wielkość liter. Jednak chcę zezwolić im na używanie rozróżnianej wielkości liter wersji ich nazwy użytkownika.jak zindeksować nazwę użytkownika w Mongo bez rozróżniania wielkości liter?

Jaki jest najlepszy sposób sprawdzenia przy wstawianiu, że nazwa użytkownika nie zawiera rozróżniania wielkości liter? I obecnie zobaczyć 2 sposoby robienia tego:

  • przechowywanie zarówno małą wersję i inną wersję ze sprawą wprowadzonej przez użytkownika oraz indeksowania tylko wersję małą
  • przechowywać tylko w wersji z obudową wprowadzone przez użytkownik i małe litery to dla porównania, które pokonuje cel indeksu Przypuszczam, że

Czy istnieje lepszy sposób?

Odpowiedz

-1

Indeksowanie NIE ma z tym nic wspólnego, indeksowanie służy do szybszego wyszukiwania (wyszukiwania).

db.userTable.find({ storedUserName: /^userEnteredUserName$/i }); 

Zobacz https://www.google.co.uk/search?q=mongodb+case+insensitive+search

+2

Ograniczenia indeksowania i unikalności nie wykluczają się wzajemnie: http: //www.mongodb.org/display/DOCS/Indexes # Indexes-unique% 3Atrue – jmikola

+0

Nie powiedziałem, że wykluczają się wzajemnie, powiedziałem, że samo indeksowanie NIE zapewnia wyjątkowości. –

+1

@jmikola I ogólnie złym zwyczajem jest polegać na DB, aby wymuszać (unikalne) ograniczenia, które powinny być sprawdzane przez aplikację. wywołanie find() zwraca wynik, ograniczenie DB powoduje wyjątek. –

9

Przechowywanie pierwotnie wprowadzone przez użytkownika i wersję kanoniczną (małymi literami) dla aplikacji jest całkowicie uzasadnione. Wystarczy upewnić się, że pole kanoniczne jest aktualizowane w modelu za każdym razem, gdy ustawiona jest nazwa użytkownika, i sprawdzić naruszeń ograniczeń za pomocą unikalnego indeksu pola kanonicznego.

Innym scenariuszem, w którym to rozwiązanie (oryginalne i kanoniczne) ma sens, są artykuły, w których ten sam tytuł może zostać ponownie użyty, ale fragment (dla adresu URL) musi być niepowtarzalny.

1

Wydaje się, że będzie wspierać MongoDB wielkości liter indeksowanie od wersji 3.4 (wkrótce ma zostać wydany). Zobacz: ticket i dokumentację collation.

W przykładzie dostał od wspomnianego biletu, widzimy, że za pomocą collation z sile 2 zarówno createIndex i find, wykonuje case-insensitve wyszukiwania:

> db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}}); 
> db.myCollection.insert({_id: 1, city: "New York"}); 
> db.myCollection.insert({_id: 2, city: "new york"}); 
> db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2}); 
{ "_id" : 1, "city" : "New York" } 
{ "_id" : 2, "city" : "new york" } 
3

MongoDB 3.4 zawiera teraz możliwość utworzenia indeksu niewrażliwego na wielkość liter. Jest on tworzony poprzez określenie sortowania o wartości 2.

Prawdopodobnie najprostszym sposobem na to jest ustawienie sortowania w samej bazie danych. Następnie wszystkie zapytania dziedziczyć że sortowanie i będzie go używać:

db.createCollection("cities", { collation: { locale: 'en_US', strength: 2 } }) 
db.cities.createIndex({ city: 1 }) // inherits the default collation 
db.cities.find({city:"new york"}) //inherits default collation 

Albo można to zrobić na indeksie poszczególnych index:

db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}}); 

i używać go tak:

db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2}); 

Aby uzyskać więcej informacji: https://jira.mongodb.org/browse/SERVER-90

+0

ktoś wie, jak zrobić .collation w PHP? dzięki! – Idan

+0

Myślę, że: find ([], ["sortowanie" => ["locale" => "en", "siła" => 2]) '. Zobacz https://docs.mongodb.com/php-library/master/reference/method/MongoDBCollection-find/ – user3413723

Powiązane problemy