使用C#Mongo驱动程序通过$ regex搜索构建Mongo聚合管道查询

时间:2020-06-10 11:42:38

标签: c# mongodb aggregation-framework

我正在尝试使用C#mongo驱动程序根据值构建具有值搜索的聚合管道。 根据正则表达式的文档,第一阶段将过滤KeyA为“ A”的位置,然后第二阶段将进行搜索,在该位置我需要查看一定数量的键并将其值与正则表达式进行比较。只检查字符串,我需要检查值可以容纳的任何类型。 我正在添加一个模型和代码示例以说明到目前为止的工作,但仍无法达到预期的最终结果,因此可以寻求任何帮助。

模型例如:

{ 
"_id" : ObjectId(), 
"KeyA" : "A", 
"KeyB" : NumberInt(5), 
"KeyNestedObj" : [
    {
        "KeyC" : "C"
    }, 
    {
        "KeyD" : "D"
    },
    {
        "KeyE" : NumberInt(5)
    }
 ]
}

Mongo shell查询:

db.MongoTests.aggregate([{ "$match": { "KeyA": "A" }},
{ "$match": { "$or": [{ "KeyNestedObj": { "$elemMatch": { "KeyC": /^.*?Regex.*?$/ } } }, { "KeyNestedObj": { "$elemMatch": { "KeyE": /^.*?Regex.*?$/ }}}]}}])

C#查询版本:

var searchableFields = new List<SearchableField>
{
    new SearchableField{ Field = "KeyC" },
    new SearchableField{ Field = "KeyE" }
};

var searchableFieldsFilter = new List<FilterDefinition<Model>>();
var commonSearchBuilder = Builders<Model>.Filter;
var nestedObjSearchBuilder = Builders<KeyNestedObj>.Filter;

var searchValueRegex = new BsonRegularExpression($"^.*?{searchValue}.*?$");
foreach (var searchableField in searchableFields)
{
   var searchNestedField =
         commonSearchBuilder.ElemMatch(x => x.KeyNestedObj,
            nestedObjSearchBuilder.Regex(searchableField.Field, searchValueRegex));
   searchableFieldsFilter.Add(searchNestedField);
}

return Builders<ActivityDataModel>.Filter.And(searchableFieldsFilter);

代码聚合查询:

var renderedSearchQuery = searchStage.Render(mongoContext.Data.DocumentSerializer,
mongoContext.Data.Settings.SerializerRegistry);
var results= mongoContext.Data.Aggregate().Match(filterQuery).AppendStage<Model>(renderedSearchQuery).ToListAsync();

0 个答案:

没有答案