使用 MongoDB C# 驱动程序编写带有正则表达式查询的 ElementMatch
Using MongoDB C# Driver write ElementMatch with Regex query
我需要使用 MongoDB C# 驱动程序构建以下查询
db.Notes.find({ "Group._id" : 74, "CustomFields" : { "$elemMatch" : { "Value" : /batch/i } }, "IsDeleted" : false }).sort({ "CreatedDateTimeUtc" : -1 })
我使用了这样的查询
builder.ElemMatch(x => x.CustomFields, x => x.Value.Contains(filterValue))
它生成 mongo 查询为
db.Notes.find({ "Group._id" : 74, "CustomFields" : { "$elemMatch" : { "Value" : /batch/s } }, "IsDeleted" : false }).sort({ "CreatedDateTimeUtc" : -1 })
如果您注意到它在 /batch/s
处附加 s 而不是 i /batch/i
我怎样才能得到这份工作?我需要为
这样的过滤器执行此操作
- 包含,使用.Contains()
- 等于,考虑使用.Equals()
- 不包含,想用!Field.contains(value)
- 不等于
- 开头为
- 结尾为
我可以做这样的事情吗,这样我就可以将我的所有正则表达式模式应用于上述所有过滤器。
builder.Regex(x => x.CustomFields[-1].Value, new BsonRegularExpression($"/{filterValue}/i"));
这会将查询转换为如下所示,但不会得到任何结果
db.Notes.find({ "Project._id" : 74, "CustomFields.$.Value" : /bat/i, "IsDeleted" : false }).sort({ "CreatedDateTimeUtc" : -1 })
仅供参考:builder
是 FilterDefinition<Note>
我的示例笔记集是这样的:
{
Name:"",
Email:"",
Tel:"",
Date:02 /21/1945,
CustomFields:[
{
Name:"",
Value:"",
IsSearchable:true,
},
{
Name:"",
Value:"",
IsSearchable:true,
},
{
Name:"",
Value:"",
IsSearchable:true,
},
{
Name:"",
Value:"",
IsSearchable:true,
}
]
}
听起来你所缺少的只是不敏感的部分。你试过这个吗?
ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant (string method)
These methods are used to test whether a string field or property of
the document matches a value in a case-insensitive manner.
根据 1.1 文档 here,它表示将允许执行不区分大小写的正则表达式匹配。
当前文档没有提到它,所以为了确定,我检查了 github 并且创建不敏感匹配的代码仍然是 there.
我需要使用 MongoDB C# 驱动程序构建以下查询
db.Notes.find({ "Group._id" : 74, "CustomFields" : { "$elemMatch" : { "Value" : /batch/i } }, "IsDeleted" : false }).sort({ "CreatedDateTimeUtc" : -1 })
我使用了这样的查询
builder.ElemMatch(x => x.CustomFields, x => x.Value.Contains(filterValue))
它生成 mongo 查询为
db.Notes.find({ "Group._id" : 74, "CustomFields" : { "$elemMatch" : { "Value" : /batch/s } }, "IsDeleted" : false }).sort({ "CreatedDateTimeUtc" : -1 })
如果您注意到它在 /batch/s
处附加 s 而不是 i /batch/i
我怎样才能得到这份工作?我需要为
这样的过滤器执行此操作- 包含,使用.Contains()
- 等于,考虑使用.Equals()
- 不包含,想用!Field.contains(value)
- 不等于
- 开头为
- 结尾为
我可以做这样的事情吗,这样我就可以将我的所有正则表达式模式应用于上述所有过滤器。
builder.Regex(x => x.CustomFields[-1].Value, new BsonRegularExpression($"/{filterValue}/i"));
这会将查询转换为如下所示,但不会得到任何结果
db.Notes.find({ "Project._id" : 74, "CustomFields.$.Value" : /bat/i, "IsDeleted" : false }).sort({ "CreatedDateTimeUtc" : -1 })
仅供参考:builder
是 FilterDefinition<Note>
我的示例笔记集是这样的:
{
Name:"",
Email:"",
Tel:"",
Date:02 /21/1945,
CustomFields:[
{
Name:"",
Value:"",
IsSearchable:true,
},
{
Name:"",
Value:"",
IsSearchable:true,
},
{
Name:"",
Value:"",
IsSearchable:true,
},
{
Name:"",
Value:"",
IsSearchable:true,
}
]
}
听起来你所缺少的只是不敏感的部分。你试过这个吗?
ToLower, ToLowerInvariant, ToUpper, ToUpperInvariant (string method) These methods are used to test whether a string field or property of the document matches a value in a case-insensitive manner.
根据 1.1 文档 here,它表示将允许执行不区分大小写的正则表达式匹配。 当前文档没有提到它,所以为了确定,我检查了 github 并且创建不敏感匹配的代码仍然是 there.