我有以下带有记录的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#中构建此管道是不值得的,因为在您的情况下没有objectToArray
的构建器。如果您的别名叶子是数组项,那么我们可以使用驱动程序的构建器来构建它。也许其他人有更好的方法。让我们看看...
db.companies.aggregate([
{
$match: {
$expr: {
$gt: [
{
$size: {
$filter: {
input: {
$objectToArray: "$Aliases"
},
as: "alias",
cond: {
$regexMatch: {
input: "$$alias.v.FullName",
regex: /CONST/
}
}
}
}
},
0
]
}
}
}
])