假设我的mongodb数据用int存储一些数据
现在我想查询聚合与正则表达式那些num以85开头,我如何用聚合函数做到这一点?
首先,您必须使用$ substr运算符将整数转换为字符串,而不是使用$ regex运算符执行$ match funtion
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
的最大可能值。对于丑陋的代码感到抱歉,但它应该运行得更快。
在特定情况下使用正则表达式毫无意义。正如其他人已经指出的那样,可以使用$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
}
}])