我不是使用$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
在文档中添加另一个计算字段,即您的数字的字符串值。
the$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"
]
}}
])