2010-12-16 87 views

回答

51

做到這一點的最簡單,最安全的方法是使用Linq

var names = namesCollection.AsQueryable().Where(name => 
    name.FirstName.ToLower().Contains("hamster")); 

正如tutorialToLowerToLowerInvariantToUpperToUpperInvariant都在不區分大小寫的方式進行比賽說明。之後,您可以使用所有支持的字符串方法,如ContainsStartsWith

這個例子將產生:

{ 
    "FirstName" : /hamster/is 
} 

i選項使得它不區分大小寫。

+3

這應該是最佳答案! – 2014-05-20 20:51:41

+0

@ Meta-Knight我同意。 – i3arnon 2014-05-20 21:07:10

+0

你怎麼知道用'Linq'查詢'query'是否找到了,我只是試着用它,但我不知道我的條件是否滿足 – Kyojimaru 2014-09-09 11:14:13

12

你可能要與它的實際價值再存放場兩次,一次,並在所有小寫。然後,您可以查詢小寫字母版本以進行不區分大小寫的搜索(不要忘記也小寫查詢字符串)。

這種方法適用於許多數據庫系統(或者是必須的),它應該比基於正則表達式的技術(至少對於前綴或精確匹配)執行得更好。

+0

這不是一個實際的解決方案國際海事組織。正確的答案在這裏。 http://stackoverflow.com/a/8246621/309644 – afollestad 2017-03-25 04:22:17

+0

@afollestad取決於。使用全文搜索有其自身的缺點。一個普通的B-Tree索引字段可以做很好的事情,比如前綴搜索,或者更容易與其他字段組合。 – Thilo 2017-03-25 06:06:01

14

嘗試使用這樣的:

Query.Matches("FieldName", BsonRegularExpression.Create(new Regex(searchKey, RegexOptions.IgnoreCase))) 
+0

沒有問題,但請注意爲此字段創建的索引。 – 2010-12-16 15:29:01

+4

使用/ ^名字「$ /我,上面的查詢將匹配」WhateverFirstName「 – PUG 2013-09-02 02:44:48

1

萬一別人知道,使用fluent-mongo插件,你可以使用LINQ查詢這樣的:

public User FindByEmail(Email email) 
{ 
    return session.GetCollection<User>().AsQueryable() 
      .Where(u => u.EmailAddress.ToLower() == email.Address.ToLower()).FirstOrDefault(); 
} 

導致正確JS-查詢。不幸的是,String.Equals()還不支持。

+1

我想知道這是如何工作內部?我的印象是,唯一的方法是通過正則表達式(它不能使用索引)並複製該字段 – UpTheCreek 2011-09-03 17:03:44

+0

查看源代碼,它使用.toLowerCase()方法,沒有什麼特別的,但是你讓我擔心索引 – Kostassoid 2011-09-05 05:23:46

0

做到這一點的方法是使用MongoDB.Bson.BsonJavaScript類如下圖所示

store.FindAs<Property>(Query.Where(BsonJavaScript.Create(string.Format("this.City.toLowerCase().indexOf('{0}') >= 0", filter.City.ToLower())))); 
+1

我可以做到這一點,但JavaScript無法使用索引。 – 2013-02-18 07:15:43

30

我剛剛實現比任何其他建議這簡單得多。然而,由於這個問題的年齡,我意識到這個功能在當時可能還沒有提供。

使用Bson正則表達式構造函數的選項傳遞不區分大小寫。我只是看了一下源代碼,發現'我'是你需要的。例如。

var regexFilter = Regex.Escape(filter); 
var bsonRegex = new BsonRegularExpression(regexFilter, "i"); 

Query.Matches("MyField", bsonRegex); 

您不應該爲記錄保留兩次記錄。

+4

警告:如果傳入的過濾器字符串包含正則表達式符號,則會失敗。例如,如果您傳遞的是電子郵件地址「[email protected]」,它將返回0記錄,因爲「+ 「symbol。 – Justin 2014-11-04 20:55:06

+0

如果有人能夠推薦一個解決@Justin提出的評論的方法,我很樂意更新這個答案。我目前沒有和MongoDb一起工作,因此不太可能調查。 – 2015-04-01 08:47:40

+7

@bassbytesbikes你最好的選擇是用'Regex.Escape(filter)'過濾''filter'中的字符,然後傳遞它。 – ymerej 2015-04-01 20:45:25

4

正如i3arnon回答的那樣,您可以使用Queryable進行不區分大小寫的比較/搜索。我發現的是,我無法使用string.Equals()方法,因爲它不受支持。如果你需要做一個比較,Contains()將不幸不適合,這讓我在一段時間內苦苦尋找解決方案。

對於任何想做字符串比較的人,只需使用==代替.Equals()。

代碼:

var names = namesCollection.AsQueryable().Where(name => 
    name.FirstName.ToLower() == name.ToLower()); 
+1

非常感謝這個答案。我試圖按照i3arnon的回答,並一直運行到錯誤{document} {key} .ToLower()不受支持。結果如你所說:等於不支持。 – jimmy 2017-01-02 09:58:58

+0

.AsQueryable()總是將您的查詢轉換爲Aggregate pipeline,這比基本查詢更慢 – ZOXEXIVO 2017-02-01 19:38:15

0

您還可以使用MongoDB的內置過濾器。這可能會使使用mongo的一些方法更容易。

var filter = Builders<Model>.Filter.Where(p => p.PropertyName.ToLower().Contains(s.ToLower())); 
var list = collection.Find(filter).Sort(mySort).ToList();