我正在編寫一個web服務,用戶可以選擇一個必須是不區分大小寫的唯一用戶名。不過,我希望允許他們使用其用戶名的區分大小寫的版本。如何以不區分大小寫的方式在mongo中索引用戶名?
在插入時檢查用戶名沒有不區分大小寫的重複的最佳方法是什麼?我現在看到兩種方式這樣做的:
- 存儲兩個小寫版本,另一個版本由用戶輸入的情況下,和索引只有小寫版本
- 只存儲與本案版由進入用戶和小寫它進行比較,這就違背了索引的目的我想
有沒有更好的方法?
我正在編寫一個web服務,用戶可以選擇一個必須是不區分大小寫的唯一用戶名。不過,我希望允許他們使用其用戶名的區分大小寫的版本。如何以不區分大小寫的方式在mongo中索引用戶名?
在插入時檢查用戶名沒有不區分大小寫的重複的最佳方法是什麼?我現在看到兩種方式這樣做的:
有沒有更好的方法?
索引與它沒有任何關係,索引在那裏可以更快地查找(搜索)。
db.userTable.find({ storedUserName: /^userEnteredUserName$/i });
見https://www.google.co.uk/search?q=mongodb+case+insensitive+search
存儲原先輸入的用戶名和規範版本(小寫爲您的應用程序)是完全合理的。只要確保在設置用戶名時在模型中更新了規範字段,並通過規範字段的唯一索引來檢查約束違規。
此解決方案(原始和規範字段)有意義的另一場景是文章,其中可能重複使用相同標題,但slug(對於URL)必須是唯一的。
看來,MongoDB的支持不區分大小寫的索引從版本3.4 (即將發佈)。請參閱此ticket和collation的文檔。
在這個例子中自提票了,我們看到使用collation
在兩個createIndex
和find
一個強度的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" }
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});
任何人都知道如何在PHP中執行.collation?謝謝! – Idan 2016-12-14 20:18:14
我想:'find([],[「collation」=> [「locale」=>「en」,「strength」=> 2])'。見https://docs.mongodb.com/php-library/master/reference/method/MongoDBCollection-find/ – user3413723 2016-12-14 20:32:44
索引和唯一性約束不是相互排斥的:http://www.mongodb。org/display/DOCS/Indexes#Indexes-unique%3Atrue – jmikola 2012-08-08 14:37:30
我沒有說他們是互斥的,我說索引本身並不能保證唯一性。 – 2012-08-08 14:45:48
@jmikola通常情況下,依賴於數據庫來執行應該由應用程序檢查的(唯一的)約束是不好的做法。 調用find()返回結果,DB約束導致異常。 – 2012-08-08 14:53:41