在MongoDB查询中,我试图匹配具有字符串字段的记录,该字符串字段在该字符串中任何单词的开头都包含一个搜索词。正则表达式可在regex101.com上正常工作。
/\bCh/i
匹配值:
奇亚籽
我喜欢吃奇亚籽
我喜欢吃奇亚籽
但是,当我在MongoDB查询中尝试相同操作时,没有匹配的记录。
{
"TenantNames" : /(\bSmith)/i
}
我也尝试了/(\bSmith.*)/
i和/(\bSmith.*\b)/i
,但是它们都没有返回匹配的记录。我想念什么?
我正在使用C#驱动程序来构建查询。
答案 0 :(得分:0)
不确定,可能是所需的输出,我猜您可能正在尝试设计类似于以下内容的表达式:
.*\bChia\b.*
或:
.*\bSmith\b.*
也不确定i
中的mongodb
标志如何工作。
基于this doc,也许我们可能还想使用一些不同的命令来执行此任务,例如:
{ name: { $regex: /.*\bSmith\b.*/, $options: 'i', $nin: [ 'TenantNames' ] } }
在this demo的右上角对表达式进行了说明,如果您想探索/简化/修改它,在this link中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。
答案 1 :(得分:0)
这很容易通过创建文本索引并进行$text搜索来实现。
db.Property.createIndex({"TenantNames": "text"},{"background":false})
db.Property.find({
"$text": {
"$search": "smith",
"$caseSensitive": false
}
})
这是生成上述查询的C#代码。为了简洁起见,它使用我的库MongoDB.Entities。
using MongoDB.Entities;
using System;
namespace StackOverflow
{
public class Program
{
public class Property : Entity
{
public string TenantNames { get; set; }
}
private static void Main(string[] args)
{
new DB("test");
DB.Index<Property>()
.Key(p => p.TenantNames, KeyType.Text)
.Option(o => o.Background = false)
.Create();
(new[] {
new Property { TenantNames = "Maggie Smith" },
new Property { TenantNames = "Smith Clein" },
new Property { TenantNames = "marcus smith stein" },
new Property { TenantNames = "Frank Bismith" }
}).Save();
var result = DB.SearchText<Property>("smith");
foreach (var property in result)
{
Console.WriteLine(property.TenantNames);
}
Console.Read();
}
}
}