MongoDB的总查询的Int64

MongoDB的总查询的Int64

问题描述:

让说我的MongoDB的数据存储一些数据与诠释MongoDB的总查询的Int64

  1. 编号:850531015931
  2. 编号:860338053336
  3. 编号:859923992712

现在我想查询聚合与正则表达式 那些数字以85开头,我如何做到这一点与聚合函数?

首先,你必须使用$ SUBSTR运营商整数转换成字符串比使用$正则表达式操作

db.collection.aggregate([{$project :{numstring : {$substr :["$number",0,12]}}},{$match :{"numstring":{$regex : /^8.5/}}}]) 
+0

感谢您的回答。 –

+0

@ G.C.Looi,由于错误的正则表达式,这个答案会给你不正确的结果(4J41的答案是正确的)。另外,在你的例子中,你实际上显示的是很长的值,而不是整数,所以长度12不适用于所有长数据范围(对于整数,实际上它应该是10)。同样,如果你确实需要一个正则表达式,4J41的答案会更好。 – dnickless

$substr可用于$project阶段将num转换为字符串值。然后你可以在正则表达式中使用$match阶段。

项目阶段:

{ 
    $project:{ 
     numAsString: { $substr : ["$num", 0, -1 ] } 
    } 
} 

比赛阶段:

{ 
    $match : { numAsString: { $regex: /^85.*/ } } 
} 
+0

感谢您的回答。 –

虽然这可以通过正则表达式来完成,我想建议的替代方法。正则表达式的问题是它不允许你索引元素。因此,随着收藏大小的增加,您的查询将变得越来越慢。

你可以去为基础,并做以下检查

{$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

感谢您的回答。 –