MongoDB的总查询的Int64
问题描述:
让说我的MongoDB的数据存储一些数据与诠释MongoDB的总查询的Int64
- 编号:850531015931
- 编号:860338053336
- 编号:859923992712
现在我想查询聚合与正则表达式 那些数字以85开头,我如何做到这一点与聚合函数?
答
首先,你必须使用$ SUBSTR运营商整数转换成字符串比使用$正则表达式操作
db.collection.aggregate([{$project :{numstring : {$substr :["$number",0,12]}}},{$match :{"numstring":{$regex : /^8.5/}}}])
答
虽然这可以通过正则表达式来完成,我想建议的替代方法。正则表达式的问题是它不允许你索引元素。因此,随着收藏大小的增加,您的查询将变得越来越慢。
你可以去为基础,并做以下检查
{$or: [
{$and: [ {$gte: ['$num', 85] }, {$lte: ['$num', 85] } ]},
{$and: [ {$gte: ['$num', 850] }, {$lte: ['$num', 859] } ]},
{$and: [ {$gte: ['$num', 8500] }, {$lte: ['$num', 8599] } ]},
{$and: [ {$gte: ['$num', 85000] }, {$lte: ['$num', 85999] } ]},
{$and: [ {$gte: ['$num', 850000] }, {$lte: ['$num', 859999] } ]},
{$and: [ {$gte: ['$num', 8500000] }, {$lte: ['$num', 8599999] } ]},
{$and: [ {$gte: ['$num', 85000000] }, {$lte: ['$num', 85999999] } ]},
{$and: [ {$gte: ['$num', 850000000] }, {$lte: ['$num', 859999999] } ]},
{$and: [ {$gte: ['$num', 8500000000] }, {$lte: ['$num', 8599999999] } ]},
{$and: [ {$gte: ['$num', 85000000000] }, {$lte: ['$num', 85999999999] } ]},
]}
坚持做下去,直到你在num
达到最大可能的值。对不起,难看的代码,但它应该运行更快。
+0
感谢您的回答。 –
答
有没有在您的特定使用正则表达式是没有意义的执行$匹配 funtion案件。至于其他人已经指出转换为字符串可以用$substr做,但它需要的过滤所有的是一个标准等于比较:
db.collection.aggregate([{
$addFields: {
"firstTwoDigits": { // create a new field called "firstTwoDigits"
$substr: ["$num", 0, 2] // extract the first two digits only
}
}
}, {
$match: {
"firstTwoDigits": "85" // simple filter
}
}])
+0
感谢您的回答。 –
感谢您的回答。 –
@ G.C.Looi,由于错误的正则表达式,这个答案会给你不正确的结果(4J41的答案是正确的)。另外,在你的例子中,你实际上显示的是很长的值,而不是整数,所以长度12不适用于所有长数据范围(对于整数,实际上它应该是10)。同样,如果你确实需要一个正则表达式,4J41的答案会更好。 – dnickless