Regex Mongo匹配编号为;以“开始”;以数字数组进行查询

Regex Mongo匹配编号为;以“开始”;以数字数组进行查询,regex,mongodb,mongodb-query,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]}] 我试着用它来查找任何文件,数字以87开头 db.TestColleciton.find( { "number

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

一个示例对象:

[{"name":"test", "numbers" : [76.3922, 42.9196154]}, 
{"name":"test", "numbers" : [87.938547, 42.9196154]},
{"name":"test", "numbers" : [42.9196154,87.938547]}]
我试着用它来查找任何文件,数字以87开头

db.TestColleciton.find( { "numbers": { $in: [ /^-87/ ] } } )

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

另一个误解似乎是使用了。您不需要该操作符“仅仅”对数组元素执行测试,而是相反,您可以提供一个值数组来对字段(单个值或数组)进行测试。这基本上是在同一字段上测试多个值的条件的简写形式。因为只有一个值需要测试,所以这里可能不需要它

如果您的目的是匹配以“87”值开头的文档,那么可以使用JavaScript计算。虽然这不是最理想的做法,但由于索引不能用于匹配,且提供的函数必须对整个集合或至少其他查询参数的结果进行蛮力测试:

db.TestCollection.find(
函数(){
返回此.number.some(函数(el){
返回/^87/.测试(el);
});
}
)
直接向
.find()
提供
函数
参数是
$where
的shell“shorcut”,但您也可以将长格式与提供JavaScript表达式的任何字符串一起使用,以返回
真/假
。还要注意的是,插入符号
^
是正则表达式中用于“start with”的正确元素。JavaScript在这里“stringifies”,因此测试将返回true

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

db.TestCollection.find({
“数字”:{“$gte”:87,$lt:88}
})
因此and运算符以最有效的方式限制了从
87
开始的所有可能的浮点组合的范围。当然,您只需要将数组元素应用于测试,所有元素都将被输入

因此,在寻找以“开始”的数字时,最好考虑数字的“范围”,而不是使用正则表达式。

参考

用于查询中模式匹配字符串的MongoDB正则表达式功能。我们已经考虑过这个问题,但不要认为允许针对非字符串字段使用正则表达式是个好主意。这将是非常缓慢的,而且有点误导

我们可以通过


您是指
数字
数组中的第一个数字吗?另外,如果
numbers
中的元素是浮点数,则正则表达式将不起作用。要使用正则表达式,数组元素必须是字符串。正则表达式中还有一个负号,因此它只能匹配
-87
,这就是您想要的吗?@user3100115 True。因此,这里的解决方案要么是看“严格化”数值,要么是更好地考虑“范围”中所有可能的值,用于数字“开始”。取决于这意味着什么的精确性。
> db.TestColleciton.find({$where: 'return this.numbers.some(function(n){ return /^87.*/.test(n);})'})