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

27

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

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"
            ]
        }
    ]
)

我希望找到以“ma”开头且以“l”结尾的名字,例如“manoel”或“manuel”。

我已经弄清楚如何使用以下查询中的一个来实现其中之一:

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

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

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


还要参考想要Mongo查询执行字符串正则表达式的开头&&包含&&结尾,因为这是可能做的最糟糕的事情之一。所有查询形式都无法使用索引。 - Neil Lunn
4个回答

28

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

db.usuarios.find({nome: /^ma.*l$/})
在正则表达式中,.* 表示匹配零个或多个任意字符。所以这个正则表达式会匹配以 ma 开头并以 l 结尾的名称,忽略它们之间的任何内容。

13

使用AND操作符组合两个查询

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

})

4
答案正确,但这里不需要使用$regex{nome: /^ma/}就可以了。 - yaoxing

8
在JavaScript中,/.../是一个正则表达式,因此不需要使用$regex
db.usuarios.find({
    $and:[
        {nome: /^ma/ },
        {nome: /l$/ }
    ]
})

需要注意的是,starts with 可以命中索引,而 ends with 不能。因此最好使用有选择性的 starts with,否则会进行大量的对象扫描,这可能会占用额外的 CPU 资源,并且可能会减慢查询速度。


1
提高endswith性能的解决方法是将文档插入到一个重复该字段但内容反转的副本中。 - robert

1

也许这个代码可以帮到你。

你可以搜索小写字符串和大写字符串……

enter image description here


这个可以工作,但需要知道性能方面的考虑。正则表达式不支持排序规则,因此在执行大小写不敏感的正则表达式匹配时无法使用索引。这意味着Mongo必须执行集合扫描。 - Steve Storck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接