我想要正则表达式搜索MongoDB中的整数值.这可能吗?
我正在构建一个CRUD类型的接口,允许*在各个字段上使用通配符.我试图保持UI与整数的几个字段保持一致.
考虑:
> db.seDemo.insert({ "example" : 1234 }); > db.seDemo.find({ "example" : 1234 }); { "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 } > db.seDemo.find({ "example" : /^123.*/ }); >
如您所见,我插入一个对象,我可以通过值找到它.如果我尝试一个简单的正则表达式,我实际上找不到该对象.
谢谢!
如果你想在数字上进行模式匹配,那么在mongo中使用它的方法是使用$ where表达式并传入模式匹配.
> db.test.find({ $where: "/^123.*/.test(this.example)" }) { "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }
我不太喜欢使用$where
查询运算符,因为它评估查询表达式的方式,如果查询使用用户输入数据就不使用索引和安全风险。
从MongoDB 4.2开始,您可以使用$regexMatch|$regexFind|$regexFindAll
MongoDB 4.1.9+中的可用工具,并$expr
执行此操作。
let regex = /123/;
$regexMatch
和 $regexFind
db.col.find({ "$expr": { "$regexMatch": { "input": {"$toString": "$name"}, "regex": /123/ } } })
$regexFinAll
db.col.find({ "$expr": { "$gt": [ { "$size": { "$regexFindAll": { "input": {"$toString": "$name"}, "regex": "123" } } }, 0 ] } })
在MongoDB 4.0中,您可以使用$toString
运算符,该运算符是对运算符的包装,以$convert
对整数进行字符串化。
db.seDemo.aggregate([ { "$redact": { "$cond": [ { "$gt": [ { "$indexOfCP": [ { "$toString": "$example" }, "123" ] }, -1 ] }, "$$KEEP", "$$PRUNE" ] }} ])
从3.4版开始,如果要检索包含特定子字符串的所有文档,则可以使用$redact
允许$cond
迭代逻辑处理的运算符。$indexOfCP
。
db.seDemo.aggregate([ { "$redact": { "$cond": [ { "$gt": [ { "$indexOfCP": [ { "$toLower": "$example" }, "123" ] }, -1 ] }, "$$KEEP", "$$PRUNE" ] }} ])
产生:
{ "_id" : ObjectId("579c668c1c52188b56a235b7"), "example" : 1234 } { "_id" : ObjectId("579c66971c52188b56a235b9"), "example" : 12334 }
在MongoDB 3.4之前,您需要$project
在文档中添加另一个计算字段,该字段是数字的字符串值。
在$toLower
和他的兄弟$toUpper
运营商分别将字符串转换为大写和小写,但他们有一个未知的小功能,这是他们可以用来整数转换为字符串。
该$match
运营商可将所有那些符合使用你的模式的文档$regex
操作。
db.seDemo.aggregate( [ { "$project": { "stringifyExample": { "$toLower": "$example" }, "example": 1 }}, { "$match": { "stringifyExample": /^123.*/ } } ] )
产生:
{ "_id" : ObjectId("579c668c1c52188b56a235b7"), "example" : 1234, "stringifyExample" : "1234" } { "_id" : ObjectId("579c66971c52188b56a235b9"), "example" : 12334, "stringifyExample" : "12334" }
现在,如果您要检索包含特定子字符串的所有文档,那么更简单,更好的方法是在即将发行的MongoDB版本中(截至撰写本文时)使用$redact
允许$cond
迭代逻辑处理的运算符。$indexOfCP
。
db.seDemo.aggregate([ { "$redact": { "$cond": [ { "$gt": [ { "$indexOfCP": [ { "$toLower": "$example" }, "123" ] }, -1 ] }, "$$KEEP", "$$PRUNE" ] }} ])