c# - 使用 C# Mongo 驱动程序通过 $regex 搜索构建 Mongo 聚合管道查询
问题描述
我正在尝试根据 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();
解决方案
推荐阅读
- html - 在 HTML/CSS 中自定义定理环境
- python - Numpy 数组进入 if 语句修改其值
- python - 如何在 Python 中将字符串格式的二进制文件转换为真正的二进制对象?
- github - GitHub 未正确克隆 Wiki
- docker - pdf2htmlEX - 由于编译错误,Docker 镜像构建失败
- youtube-api - Wordpress 和 Revolution Slider - “onPlayerStateChange”不再触发
- java - 在 JAX-RPC 1.1 WS 中隐藏 WSDL
- azure-devops - Azure DevOps 不允许将 xlsm 文件添加为 wiki 中的链接
- java - MaterialDatePicker android选择指定日期之前而不是指定日期
- git - 在 .gitattributes 中排除文件被视为文本