在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/ ] } } )
答案 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。
但是,在这里使用自然查询运算符的更好的情况是更高效,基本上寻找87
和88
之间的所有值。这将以有效的方式返回所有浮点变化:
db.TestCollection.find({
"numbers": { "$gte": 87, "$lt": 88 }
})
因此$gte
和$lt
运算符以最有效的方式绑定了以87
开头的所有可能浮点组合的范围。当然,您只需要应用数组元素进行测试,并且所有元素都将被视为。
因此,在查找"以"开头的数字时,最好再看一下数字"范围"考虑而不是诉诸正则表达式。
答案 1 :(得分:0)