2012-08-08 34 views
8

Tôi đang mã hóa dịch vụ web nơi người dùng có thể chọn một tên người dùng không phân biệt chữ hoa chữ thường. Tuy nhiên, tôi muốn cho phép họ sử dụng phiên bản tên người dùng nhạy cảm.cách lập chỉ mục tên người dùng trong Mongo với phân biệt chữ hoa chữ thường?

Cách tốt nhất để kiểm tra khi chèn tên người dùng không có bản sao phân biệt chữ hoa chữ thường là gì? Tôi hiện thấy 2 cách để làm điều này:

  • lưu trữ cả một phiên bản thường và phiên bản khác với trường hợp nhập vào bởi người sử dụng, và lập chỉ mục chỉ có phiên bản chữ thường
  • cửa hàng chỉ có phiên bản với các trường hợp nhập vào bởi người người dùng và viết thường nó để so sánh, đánh bại mục đích của chỉ mục tôi giả sử

Có cách nào tốt hơn không?

Trả lời

-1

Lập chỉ mục KHÔNG có gì để làm với nó, lập chỉ mục ở đó để tìm kiếm nhanh hơn (tìm kiếm).

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

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

+2

Ràng buộc lập chỉ mục và duy nhất không loại trừ lẫn nhau: http: //www.mongodb.org/display/DOCS/Indexes # Chỉ mục-duy nhất% 3Atrue – jmikola

+0

Tôi KHÔNG nói rằng chúng loại trừ lẫn nhau, tôi đã nói rằng việc lập chỉ mục của chính nó KHÔNG đảm bảo tính duy nhất. –

+1

@jmikola Và nói chung là một thực tế không tốt để dựa vào DB để thực thi các ràng buộc (duy nhất) cần được kiểm tra bởi ứng dụng. gọi để tìm() trả về kết quả, ràng buộc DB gây ra một ngoại lệ. –

9

lưu trữ tên người dùng ban đầu-nhập và một phiên bản kinh điển (chữ thường cho ứng dụng của bạn) là hoàn toàn hợp lý. Chỉ cần đảm bảo rằng trường chuẩn được cập nhật trong mô hình của bạn bất cứ khi nào tên người dùng được đặt và kiểm tra các vi phạm ràng buộc thông qua chỉ mục duy nhất của trường kinh điển.

Một trường hợp khác mà giải pháp này (trường gốc và chuẩn) có ý nghĩa là bài viết, trong đó tiêu đề tương tự có thể được sử dụng lại nhưng slug (cho URL) phải là duy nhất.

1

Dường như MongoDB sẽ hỗ trợ case-insensitive indexing từ phiên bản 3.4 (sớm được phát hành). Xem trang này ticket và tài liệu của collation.

Trong ví dụ này nhận được từ vé đã đề cập, chúng ta thấy rằng việc sử dụng collation với một sức mạnh của 2 trong cả createIndexfind, thực hiện tìm kiếm trường insensitve:

> 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 hiện nay bao gồm các khả năng tạo ra một chỉ số không phân biệt chữ hoa chữ thường. Nó được thực hiện bằng cách xác định một collation với một sức mạnh của 2.

Có lẽ cách dễ nhất để làm điều đó là đặt một đối chiếu trên cơ sở dữ liệu. Sau đó, tất cả các truy vấn thừa kế đối chiếu đó và sẽ sử dụng nó:

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 

Hoặc bạn có thể làm điều đó trên một chỉ số theo từng chỉ số:

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

Và sử dụng nó như thế này:

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

Để biết thêm thông tin: https://jira.mongodb.org/browse/SERVER-90

+0

ai cũng biết cách thực hiện .collation trong PHP? cảm ơn! – Idan

+0

Tôi nghĩ: 'find ([], [" collation "=> [" locale "=>" vi "," strength "=> 2])'. Xem https://docs.mongodb.com/php-library/master/reference/method/MongoDBCollection-find/ – user3413723

Các vấn đề liên quan