使用正则表达式在mongo集合中的叶内搜索字段

问题描述 投票:1回答:1

我有以下带有记录的mongo集合,如下面的json示例记录所示,它表示one记录。例如,我的目标是搜索单词“ CONST”并找到“全名”字段“别名”子树内包含该单词的记录。以显示的记录为例,由于“别名”树中的叶子533-1和533-2在其各自的“全名”字段上包含字符串“ CONST”,因此应该命中。例如,如果“别名”树仅在树内包含533-3叶子,则不会被点击。

我使用C#和MongoDb.Driver程序包,并使用Regex搜索常规字段-例如对于显示的此集合上的“键”,我使用“ Builders.Filter.And(filter,Builders.Filter.Regex(“ Key”,new BsonRegularExpression(“”)))“)模式添加条件。但是对于“别名”子树中的这些字段,我不知道如何添加条件。在此字段上进行搜索的最简单方法是什么?

[请注意,在“别名”下,每个叶子都有不同的名称(533-1、533-2等)。每个叶子的每个名称在整个集合的每个记录中都是唯一的。记录示例:

{
"_id" : "128c5c57-ae95-4a08-9fb8-d6eade663908",
"_t" : "Company",
"ActiveFrom" : "20190813154343",
"ActiveTo" : "30001001000001",
"GroupId" : "38547478-88ef-4caf-a6ce-1a9e6a85a59b",
"Key" : "533",
"FullName" : "RED BRIGADES",
"Countries" : [ 
    "ITALY"
],
"MoreInfo" : null,
"RecordDetail" : "<RecordDetail></RecordDetail>",
"Aliases" : {
    "533-1" : {
        "Key" : "533-1",
        "FullName" : "BRIGADAS ROJAS PARA LA CONSTRUCCIÓN DEL PARTIDO COMUNISTA COMBATIENTE",
        "OriginalKey" : "533"
    },
    "533-2" : {
        "Key" : "533-2",
        "FullName" : "BRIGADES ROUGES POUR LA CONSTRUCTION DU PARTI COMMUNISTE COMBATTANT",
        "OriginalKey" : "533"
    },
    "533-3" : {
        "Key" : "533-3",
        "FullName" : "BRIGATE ROSSE",
        "OriginalKey" : "533"
    },
    "533-4" : {
        "Key" : "533-4",
        "FullName" : "BRIGATE ROSSE PER LA COSTRUZIONE DEL PARTITO COMUNISTA COMBATTENTE",
        "OriginalKey" : "533"
    }
}

}

c# mongodb mongodb-.net-driver
1个回答
0
投票

以下聚合管道将为您提供所需的结果。我认为尝试在c#中构建此管道是不值得的,因为在您的情况下没有objectToArray的构建器。如果您的别名叶子是数组项,那么我们可以使用驱动程序的构建器来构建它。也许其他人有更好的方法。让我们看看...

db.companies.aggregate([
{
  $match: {
    $expr: {
      $gt: [
        {
          $size: {
            $filter: {
              input: {
                $objectToArray: "$Aliases"
              },
              as: "alias",
              cond: {
                $regexMatch: {
                  input: "$$alias.v.FullName",
                  regex: /CONST/
                }
              }
            }
          }
        },
        0
      ]
    }
  }
}
])
© www.soinside.com 2019 - 2024. All rights reserved.