MongoDB:不区分大小写和重音
MongoDB: Case insensitive and accent insensitive
我正在寻找字符串 "JESÚS"
但只有 returns 具有指定字符串的文档,我需要搜索以忽略重音符号和大写字母。
我正在使用 C# 和 mongodb 驱动程序。
我的 mongodb 中保存了两个文档:
_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"
_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"
在带有 mongo 驱动程序的 visual c# 中:
var filter = Builders<BsonDocument>.Filter.Regex("TRABAJADOR", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i"));
var result = collection.Find(filter, new FindOptions() { Collation = new Collation("es", strength: CollationStrength.Primary, caseLevel:true) }).ToList();
output = JsonConvert.SerializeObject(result);
return output;
如果我搜索"JESÚS"
,实际输出:
_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"
但实际上我期待以下输出:
_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"
_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"
您需要查看两个字段才能同时获得:
var filter = Builders<BsonDocument>.Filter;
var query = filter.Regex("TRABAJADOR", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i")) & filter.Regex("WORKER", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i"));
用这两行替换你的第一行,并为你的查找提供 query。
我没有测试,希望对你有用!
我建议您创建一个默认语言设置为 "none" 的文本索引,以使其对变音符号不敏感,然后按如下方式进行 $text 搜索:
db.Project.createIndex(
{
"WORKER": "text",
"TRABAJADOR": "text"
},
{
"background": false,
"default_language": "none"
}
)
db.Project.find({
"$text": {
"$search": "jesus",
"$caseSensitive": false
}
})
这是生成上述查询的 C# 代码。为了简洁起见,我正在使用我的图书馆 MongoDB.Entities。
using MongoDB.Entities;
using System;
using System.Linq;
namespace Whosebug
{
public class Program
{
public class Project : Entity
{
public string WORKER { get; set; }
public string TRABAJADOR { get; set; }
}
private static void Main(string[] args)
{
new DB("test");
DB.Index<Project>()
.Key(p => p.WORKER, KeyType.Text)
.Key(p => p.TRABAJADOR, KeyType.Text)
.Option(o => o.DefaultLanguage = "none")
.Option(o => o.Background = false)
.Create();
(new[] {
new Project { WORKER = "JESUS HERNANDEZ DIAZ"},
new Project { TRABAJADOR = "JESÚS HERNÁNDEZ DÍAZ"}
}).Save();
var result = DB.SearchText<Project>("jesus");
Console.WriteLine($"found: {result.Count()}");
Console.Read();
}
}
}
我正在寻找字符串 "JESÚS"
但只有 returns 具有指定字符串的文档,我需要搜索以忽略重音符号和大写字母。
我正在使用 C# 和 mongodb 驱动程序。
我的 mongodb 中保存了两个文档:
_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"
_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"
在带有 mongo 驱动程序的 visual c# 中:
var filter = Builders<BsonDocument>.Filter.Regex("TRABAJADOR", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i"));
var result = collection.Find(filter, new FindOptions() { Collation = new Collation("es", strength: CollationStrength.Primary, caseLevel:true) }).ToList();
output = JsonConvert.SerializeObject(result);
return output;
如果我搜索"JESÚS"
,实际输出:
_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"
但实际上我期待以下输出:
_id:5d265f3129ea36365c7ca587
TRABAJADOR:"JESUS HERNANDEZ DIAZ"
_id:5d265f01db86a83148404711
TRABAJADOR:"JESÚS HERNÁNDEZ DÍAZ"
您需要查看两个字段才能同时获得:
var filter = Builders<BsonDocument>.Filter;
var query = filter.Regex("TRABAJADOR", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i")) & filter.Regex("WORKER", new BsonRegularExpression(string.Format(".*{0}.*", "JESÚS"), "i"));
用这两行替换你的第一行,并为你的查找提供 query。
我没有测试,希望对你有用!
我建议您创建一个默认语言设置为 "none" 的文本索引,以使其对变音符号不敏感,然后按如下方式进行 $text 搜索:
db.Project.createIndex(
{
"WORKER": "text",
"TRABAJADOR": "text"
},
{
"background": false,
"default_language": "none"
}
)
db.Project.find({
"$text": {
"$search": "jesus",
"$caseSensitive": false
}
})
这是生成上述查询的 C# 代码。为了简洁起见,我正在使用我的图书馆 MongoDB.Entities。
using MongoDB.Entities;
using System;
using System.Linq;
namespace Whosebug
{
public class Program
{
public class Project : Entity
{
public string WORKER { get; set; }
public string TRABAJADOR { get; set; }
}
private static void Main(string[] args)
{
new DB("test");
DB.Index<Project>()
.Key(p => p.WORKER, KeyType.Text)
.Key(p => p.TRABAJADOR, KeyType.Text)
.Option(o => o.DefaultLanguage = "none")
.Option(o => o.Background = false)
.Create();
(new[] {
new Project { WORKER = "JESUS HERNANDEZ DIAZ"},
new Project { TRABAJADOR = "JESÚS HERNÁNDEZ DÍAZ"}
}).Save();
var result = DB.SearchText<Project>("jesus");
Console.WriteLine($"found: {result.Count()}");
Console.Read();
}
}
}