[英]c# mongodb case sensitive search
我有一個集合,我在其中存儲用戶的電子郵件和密碼。
我顯然不想要求用戶插入他的電子郵件區分大小寫並且與他第一次注冊時完全一樣。
我正在使用 mongodb 2.0 c# 驅動程序,我在重復它,因為我看到了用正則表達式編寫的查詢的解決方案,但恐怕我不能在這里使用它。
我的查詢看起來像
var filter = Builders<ME_User>.Filter.And(
Builders<ME_User>.Filter.Eq(u => u.Email, email),
Builders<ME_User>.Filter.Eq(u => u.Password, password));
ME_User foundUser = null;
var options = new FindOptions<ME_User>
{
Limit = 1
};
using (var cursor = await manager.User.FindAsync(filter, options))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (ME_User user in batch)
foundUser = user;
}
}
我有一個混亂的問題,殺了我,但我不能讓自己用小寫再次保存這些數據,並且有 2 個相同內容的副本。 另外,我希望電子郵件能夠像用戶插入的那樣完全保存。
不使用正則表達式對Mongodb中的字符串字段進行過濾區分大小寫。 為什么您完全不能使用正則表達式?
您的查詢可以像這樣進行編輯:
var filter = Builders<ME_User>.Filter.And(
Builders<ME_User>.Filter.Regex(u => u.Email, new BsonRegularExpression("/^" + email + "$/i"),
Builders<ME_User>.Filter.Eq(u => u.Password, password));
請注意,“ ^”和“ $”符號用於指定完整的單詞搜索,最重要的是在正則表達式(“ / i”)末尾不區分大小寫的運算符。
另一種方式應該是文本搜索,它需要創建文本索引並且對拉丁字母不區分大小寫: http : //docs.mongodb.org/manual/reference/operator/query/text/#match-operation
在C#中,您將使用“文本過濾器”:
var filter = Builders<ME_User>.Filter.And(
Builders<ME_User>.Filter.Text(email),
Builders<ME_User>.Filter.Eq(u => u.Password, password));
在OR子句中使用文本索引查詢時,您還需要在密碼字段上創建索引,否則OR查詢將產生錯誤:
OR下的其他非TEXT子句也必須被索引
我更喜歡使用Linq。
var match = theCollection.AsQueryable().SingleOrDefault(x =>
x.Email.ToLower() == emailToSearchFor.ToLower());
對於 c# 驅動程序 2.1 (MongoDB 3.0) 默認情況下區分大小寫。 要不區分大小寫,只需在 BsonRegularExpression 中添加“i”即可。 請參考以下
var filter = Builders<Users>.Filter.Regex(k=>k.Name, new BsonRegularExpression(name, "i"));
var users = await _mongoDbContext.Users.Find(filter).ToListAsync();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.