我在 MongoDB 中有带有“SSN”字符串字段的文档。它只能包含数字或带有连字符的数字,例如:
“123456789”
“12-345-6789”
“123-456789”
传入的过滤器参数只能以数字形式出现,例如。 “123456789”、“187641287”等。 如何构建过滤查询来查找这些记录?我的意思是“SSN”中的非数字字符应该被忽略,并且只有数字应该与过滤器参数进行比较。
我查看了Builders.Filter.Where,但看起来它不起作用,因为它接受表达式:
ssn ('123454784') // filter ssn value coming outside
Func<MyDocument, bool> ssnExpression() => doc =>
{
var ssnOnlyDigits = doc.SSN ?? null;
ssnOnlyDigits = string.IsNullOrEmpty(ssnOnlyDigits) ? null : Regex.Replace(ssnOnlyDigits, @"\D", string.Empty);
return ssnOnlyDigits != null && ssnOnlyDigits.Equals(ssn);
};
return Builders<MyDocument>.Filter.Where(ssnExpression());
如有任何建议,我们将不胜感激。
附注我无法将仅包含数字的“SSN”存储到数据库中。
@aneroid 建议这可以使用正则表达式来完成。在 C# 中,代码如下所示:
ssnValue // ssn filter value coming from outside
var regex = new BsonRegularExpression("^" + string.Join("-?", ssnValue.ToCharArray()) + "$");
var filter = Builders<MyDocument>.Filter.Regex(selector, regex);