Mongo 匹配数字“开始于”在数字数组中查询

Cha*_*dit 3 regex mongodb mongodb-query

在 mongo shell 中,我试图查询一个数字数组

一个示例对象:

[{"name":"test", "numbers" : [76.3922, 42.9196154]}, 
{"name":"test", "numbers" : [87.938547, 42.9196154]},
{"name":"test", "numbers" : [42.9196154,87.938547]}]
Run Code Online (Sandbox Code Playgroud)

我试图用它来查找数字以 87 开头的任何文件

db.TestColleciton.find( { "numbers": { $in: [ /^-87/ ] } } )
Run Code Online (Sandbox Code Playgroud)

Bla*_*ven 6

你在这里的方法有两个误解。首先是正则表达式只适用于字符串而不适用于数值。JavaScript 是一种语言实现的示例,它将“字符串化”数值以进行比较,但这是基本过程。以后再说。

另一个误解似乎是使用$in. 您不需要该运算符“只是”对数组元素执行测试,而是相反,您可以提供一组值来针对字段(单个值或数组)进行测试. 这基本上是$or在同一字段上测试多个值的条件的简写形式。由于只有一个值要测试,因此您可能不需要它。

如果您的意图是匹配“以”“87”值开头的文档,那么您可以使用 JavaScript 评估$where. 尽管这不是最理想的做法,因为不能在匹配中使用索引,并且必须对整个集合或至少其他查询参数的结果通过蛮力测试提供的函数:

db.TestCollection.find(
    function() {
        return this.numbers.some(function(el) {
            return /^87/.test(el);
        });
    }
)
Run Code Online (Sandbox Code Playgroud)

直接为 提供function参数.find()是一个 shell “快捷方式” $where,但您也可以使用长格式与任何提供 JavaScript 表达式以返回的字符串true/false。还要注意插入符号^是在正则表达式中用于“开始于”的正确元素。JavaScript 在这里“字符串化”,因此测试将返回 true。

但是在这里使用自然查询运算符的更好情况会更高效,基本上是查找87和之间的所有值88。这将以有效的方式返回所有浮点变化:

db.TestCollection.find({
    "numbers": { "$gte": 87, "$lt": 88 }
})
Run Code Online (Sandbox Code Playgroud)

所以$gteand$lt运算符87以最有效的方式开始限制所有可能的浮点组合的范围。当然,您只需要将数组元素应用于测试,所有元素都将被检查。

因此,在查找“开头为”的数字时,最好查看数字“范围”考虑因素,而不是求助于正则表达式。