正则表达式匹配MongoDB中字符串中单词的开头

时间:2019-07-11 20:19:11

标签: c# regex mongodb mongodb-query

在MongoDB查询中,我试图匹配具有字符串字段的记录,该字符串字段在该字符串中任何单词的开头都包含一个搜索词。正则表达式可在regex101.com上正常工作。

/\bCh/i

匹配值:

  

奇亚籽

     

我喜欢吃奇亚籽

     

我喜欢吃奇亚籽

但是,当我在MongoDB查询中尝试相同操作时,没有匹配的记录。

{
    "TenantNames" : /(\bSmith)/i
}

我也尝试了/(\bSmith.*)/ i和/(\bSmith.*\b)/i,但是它们都没有返回匹配的记录。我想念什么?

我正在使用C#驱动程序来构建查询。

2 个答案:

答案 0 :(得分:0)

不确定,可能是所需的输出,我猜您可能正在尝试设计类似于以下内容的表达式:

.*\bChia\b.*

或:

.*\bSmith\b.*

也不确定i中的mongodb标志如何工作。


基于this doc,也许我们可能还想使用一些不同的命令来执行此任务,例如:

{ name: { $regex: /.*\bSmith\b.*/, $options: 'i', $nin: [ 'TenantNames' ] } }

this demo的右上角对表达式进行了说明,如果您想探索/简化/修改它,在this link中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。

参考

MongoDB C# Query for 'Like' on string

答案 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();
        }
    }
}