MongoDB聚合查询int64

问题描述 投票:-1回答:4

假设我的mongodb数据用int存储一些数据

  1. num:850531015931
  2. num:860338053336
  3. num:859923992712

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

regex mongodb aggregate
4个回答
1
投票

首先,您必须使用$ substr运算符将整数转换为字符串,而不是使用$ regex运算符执行$ match funtion

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

1
投票

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

项目阶段:

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

比赛阶段:

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

1
投票

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

您可以去寻找基础知识并进行以下检查

{$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的最大可能值。对于丑陋的代码感到抱歉,但它应该运行得更快。


1
投票

在特定情况下使用正则表达式毫无意义。正如其他人已经指出的那样,可以使用$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
    }
}])
© www.soinside.com 2019 - 2024. All rights reserved.