2012-08-08 115 views
8

我正在編寫一個web服務,用戶可以選擇一個必須是不區分大小寫的唯一用戶名。不過,我希望允許他們使用其用戶名的區分大小寫的版本。如何以不區分大小寫的方式在mongo中索引用戶名?

在插入時檢查用戶名沒有不區分大小寫的重複的最佳方法是什麼?我現在看到兩種方式這樣做的:

  • 存儲兩個小寫版本,另一個版本由用戶輸入的情況下,和索引只有小寫版本
  • 只存儲與本案版由進入用戶和小寫它進行比較,這就違背了索引的目的我想

有沒有更好的方法?

回答

-1

索引與它沒有任何關係,索引在那裏可以更快地查找(搜索)。

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

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

+2

索引和唯一性約束不是相互排斥的:http://www.mongodb。org/display/DOCS/Indexes#Indexes-unique%3Atrue – jmikola 2012-08-08 14:37:30

+0

我沒有說他們是互斥的,我說索引本身並不能保證唯一性。 – 2012-08-08 14:45:48

+1

@jmikola通常情況下,依賴於數據庫來執行應該由應用程序檢查的(唯一的)約束是不好的做法。 調用find()返回結果,DB約束導致異常。 – 2012-08-08 14:53:41

9

存儲原先輸入的用戶名和規範版本(小寫爲您的應用程序)是完全合理的。只要確保在設置用戶名時在模型中更新了規範字段,並通過規範字段的唯一索引來檢查約束違規。

此解決方案(原始和規範字段)有意義的另一場景是文章,其中可能重複使用相同標題,但slug(對於URL)必須是唯一的。

1

看來,MongoDB的支持不區分大小寫的索引從版本3.4 (即將發佈)。請參閱此ticketcollation的文檔。

在這個例子中自提票了,我們看到使用collation在兩個createIndexfind一個強度的2,執行的情況下,鈍感搜索:

> 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現在包括能夠創建一個真正的不區分大小寫的索引。它是通過指定強度爲2的排序規則制定的。

可能最簡單的方法是在數據庫本身上設置排序規則。然後,所有的查詢繼承整理,並會使用它:

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 

或者您也可以通過指數的基礎上做它的索引:

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

而且使用這樣的:

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

更多信息:https://jira.mongodb.org/browse/SERVER-90

+0

任何人都知道如何在PHP中執行.collat​​ion?謝謝! – Idan 2016-12-14 20:18:14

+0

我想:'find([],[「collat​​ion」=> [「locale」=>「en」,「strength」=> 2])'。見https://docs.mongodb.com/php-library/master/reference/method/MongoDBCollection-find/ – user3413723 2016-12-14 20:32:44

相關問題