MongoDB子串产品搜索顺序最高匹配

时间:2015-11-12 17:08:51

标签: c# mongodb mongodb-.net-driver

我在Mongodb不太好。这是我使用它的第一个项目。我正在某种商店网站上工作。我们正在为mongodb使用C#和最新的C#驱动程序。我需要了解如何实现我的算法以根据用户的输入过滤产品。这是我的算法如何工作/应该工作的方式。

  1. 用户输入类似"蓝色adidas男士蜘蛛侠棉质T恤"
  2. 我将整个短语分成单个单词,所以我有"蓝色"," adidas"," men"," spiderman",& #34;棉花"," t恤"
  3. 我会根据我的数据库中的零售商,颜色,类别名称检查每个单词。所以,这是怎么回事。

    • "蓝色" - 哦,它是一个彩色滤镜,可以在我的mongodb文档中对照正确的字段进行过滤。
    • "阿迪达斯" - 好吧,它是零售商。与上面的内容相同
    • "男性" - 它是一个类别。好吧,让我们只搜索此类别。
    • "棉花" - 我不会用纺织品过滤。无法通过此过滤。
    • "蜘蛛侠" - 绝对不是零售商,颜色等。不能使用此过滤。
    • " T恤" - 好。它的类别名称显示为儿童,男性,女性的儿童类别,但因为我已经拥有" men"作为我的类别,我只是更深入地了解我的类别结构 - 现在我更新了我的类别我希望过滤它和男士类别下的T恤类别。

      1. 确定。我从用户输入解析了一些过滤器参数,但我仍然有棉花和蜘蛛侠的话。那就是我迷失的地方。
  4. 我不想忽视这个"蜘蛛侠"和"棉花"话。我想通过其产品名称中的单词覆盖率实际获取数据库顺序中的所有项目,因此我的预期结果(ofc与所有零售商,颜色等过滤器首先应用)是:

    名称同时包含" spiderman"和"棉花"制品 名称中包含" spiderman"或"棉花"

    我该怎么做?

1 个答案:

答案 0 :(得分:1)

首先,您可以使用& operator组合多个过滤器,如下所示:

var builder = Builders<Product>.Filter;
FilterDefinition<Product> filter = builder.Empty;
filter &= builder.Eq("Color", "blue");
filter &= builder.Eq("Retailer", "adidas");
filter &= builder.Eq("Category", "men");

然后,您可以使用Regex过滤其名称包含任何其余单词/所有其余单词的产品。
OR 搜索(名称包含“棉花”或“蜘蛛侠”)

var restWords = new string[] { "cotton", "spiderman" };
var orReg = new System.Text.RegularExpressions.Regex(string.Join("|", restWords));
filter &= builder.Regex("Name", BsonRegularExpression.Create(orReg));

List<Product> filteredList = products.Find(filter).ToListAsync().Result;

AND 搜索(名称包含“cotton”和“spiderman”)

foreach (var word in restWords)
{
    filter &= builder.Regex("Name", BsonRegularExpression.Create(new System.Text.RegularExpressions.Regex(word)));
}

List<Product> filteredList = products.Find(filter).ToListAsync().Result;