当前位置:  开发笔记 > 编程语言 > 正文

MongoDB正则表达式搜索整数值

如何解决《MongoDB正则表达式搜索整数值》经验,为你挑选了2个好方法。

我想要正则表达式搜索MongoDB中的整数值.这可能吗?

我正在构建一个CRUD类型的接口,允许*在各个字段上使用通配符.我试图保持UI与整数的几个字段保持一致.

考虑:

> db.seDemo.insert({ "example" : 1234 });
> db.seDemo.find({ "example" : 1234 });
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 }
> db.seDemo.find({ "example" : /^123.*/ });
> 

如您所见,我插入一个对象,我可以通过值找到它.如果我尝试一个简单的正则表达式,我实际上找不到该对象.

谢谢!



1> dalton..:

如果你想在数字上进行模式匹配,那么在mongo中使用它的方法是使用$ where表达式并传入模式匹配.

> db.test.find({ $where: "/^123.*/.test(this.example)" })
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 }


作为一个不相关的提示,要在PHP中使这个工作,你需要传入数组('$ where'=> new MongoCode(/ ^ 123.*/.test(this.example)");
@talentedmrjones,有这个绝口不提https://jira.mongodb.org/browse/SERVER-1174:"我们已经想到这个问题,但不认为允许对非字符串字段正则表达式是一个伟大的想法会的.非常慢,有点误导."
@dalton这里好奇,$ regex运算符不会比$ where更高效吗?
这会非常低效,不是吗?

2> styvane..:

我不太喜欢使用$where查询运算符,因为它评估查询表达式的方式,如果查询使用用户输入数据就不使用索引和安全风险。

从MongoDB 4.2开始,您可以使用$regexMatch|$regexFind|$regexFindAllMongoDB 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" 
        ] 
    }}
])


@HarpreetSingh,我更新了答案,以包括版本4.0和4.1.9+的语法
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有