【问题标题】:MongoDB WildCard query taking too much time using Grails使用 Grails 的 MongoDB 通配符查询花费了太多时间
【发布时间】:2019-01-01 13:36:54
【问题描述】:
  • MongoDB v4.0.2
  • Grails 3.3.5

我有超过 2000 万条记录存储在一个集合中。我正在尝试在该集合中进行通配符搜索,如下所示...

def personList = Person.collection.find(['vehicleNumber': ['$regex':/.*GJ18AD.*/] ]).sort(["datetime":-1])

人物集合索引

db.person.getIndexes()
{
    "v" : 2,
    "key" : {
        "vehicleNumber" : 1
    },
    "name" : "vehicleNumber_1",
    "ns" : "analytics.person",
    "weights" : {
        "numberPlate" : 1
    },
    "default_language" : "english",
    "language_override" : "language",
    "textIndexVersion" : 3
}

通配符搜索还有其他方法吗?

【问题讨论】:

  • 不使用 Grails 需要多长时间?
  • 30 分钟后仍未获得结果。
  • 如果在 mongo 控制台中运行相同的查询会怎样?
  • 在一分钟内(查询看起来像 db.person.find({'vehicleNumber': {'$regex': /.*GJ18AD.*/}})
  • 那么你应该在 GORM 中运行完全相同的查询:Person.collection.find( vehicleNumber:[ $regex:/.*GJ18AD.*/ ] ).sort( datetime:-1 )

标签: mongodb grails grails-orm


【解决方案1】:

索引中不需要更改。但是我传递给集合的过滤器对象的微小变化。

以前,我使用以下过滤器对象语法:

 def personList = Person.collection.find(['vehicleNumber': ['$regex':/.*GJ18AD.*/] ]).sort(['datetime':-1])

然后我只更改了上述语法中的正则表达式:

def personList = Person.collection.find(['vehicleNumber': ['$regex':'.*GJ18AD.*'] ]).sort(['datetime':-1])

它在 MongoDB 版本 4.2.1 中适用于我。

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多