MongoDB 正则表达式字符串以开头和结尾

use*_*130 10 regex json mongodb

所以我有一些看起来像这样的东西

db.usuarios.insert
(
    [
        {
            "nome" : "neymala",
            "idade" : 40,
            "status" : "solteira"
        },
        {
            "nome" : "gabriel",
            "idade" : 31,
            "status" : "casado"
        },
        {
            "nome" : "jose",
            "idade" : 25,
            "status" : "solteiro"
        },
        {
            "nome" : "manoel",
            "idade" : 25,
            "status" : "solteiro",
            "interesses" : [
                "esporte",
                "musica"
            ]
        }
    ]
)
Run Code Online (Sandbox Code Playgroud)

我想找到以 ma 开头并以 l 结尾的名称,例如“manoel”或“manuel”

我已经想出了如何使用空闲查询做一个或另一个:

db.usuarios.find({nome:{$regex: /^ma/ }})

db.usuarios.find({nome:{$regex: /l$/ }})
Run Code Online (Sandbox Code Playgroud)

现在我想将它们组合成一个查询。

Joh*_*yHK 12

您可以将这两个要求组合成一个正则表达式:

db.usuarios.find({nome: /^ma.*l$/})
Run Code Online (Sandbox Code Playgroud)

在正则表达式中,.*表示匹配 0 个或多个任意字符。所以这个正则表达式匹配以 开头ma和结尾的名称l,忽略两者之间的任何内容。


yao*_*ing 10

在javascript中/.../是一个正则表达式,所以不需要$regex

db.usuarios.find({
    $and:[
        {nome: /^ma/ },
        {nome: /l$/ }
    ]
})
Run Code Online (Sandbox Code Playgroud)

另请注意starts with可以命中索引。ends with不能。这样你最好有一个选择性的starts with,否则会有大量的对象扫描,这可能会占用额外的CPU并可能减慢你的查询速度。

  • 提高 endwith 性能的解决方法是插入包含该字段重复项的文档,但内容相反。 (2认同)

use*_*130 7

将两个查询与 AND 运算符结合

db.usuarios.find({
$and:[
    {nome:{$regex: /^ma/ }},
    {nome:{$regex: /l$/ }}
]

})
Run Code Online (Sandbox Code Playgroud)

  • 答案是正确的,但这里不需要 `$regex`。`{nome: /^ma/}` 很好。 (2认同)