Mongo匹配编号"以"开头查询数字数组

时间:2016-01-28 00:37:03

标签: 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( { "numbers": { $in: [ /^-87/ ] } } )

2 个答案:

答案 0 :(得分:3)

你的方法有两个误解。第一个是正则表达式只能使用字符串而不能使用数值。 JavaScript是一种语言实现的示例,它将" stringify"用于比较的数值,但这是基本过程。更晚些时候。

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

如果您打算匹配"以&#34开头的文件; " 87"值,然后您可以使用$where的JavaScript评估。虽然它不是最理想的事情,但由于索引不能用于匹配,所提供的函数必须通过强力对整个集合进行测试,或者至少是其他查询参数的结果:

db.TestCollection.find(
    function() {
        return this.numbers.some(function(el) {
            return /^87/.test(el);
        });
    }
)

直接向function提供.find()参数是一个shell" shorcut"对于$where,您也可以将长格式与任何提供JavaScript表达式的字符串一起使用以返回true/false。还注意到插入符号^是用于&#34的正确元素;以"开头。在正则表达式中。 JavaScript"字符串化"在这里,所以测试将返回true。

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

db.TestCollection.find({
    "numbers": { "$gte": 87, "$lt": 88 }
})

因此$gte$lt运算符以最有效的方式绑定了以87开头的所有可能浮点组合的范围。当然,您只需要应用数组元素进行测试,并且所有元素都将被视为。

因此,在查找"以"开头的数字时,最好再看一下数字"范围"考虑而不是诉诸正则表达式。

答案 1 :(得分:0)

请参阅this

  

用于查询中模式匹配字符串的MongoDB正则表达式功能。我们已经考虑过这个,但是不要认为允许正则表达式对非字符串字段是一个好主意。它会很慢,有点误导。

我们可以通过$where

来完成
> db.TestColleciton.find({$where: 'return this.numbers.some(function(n){ return /^87.*/.test(n);})'})