【问题标题】:Query MongoDB with length criteria使用长度标准查询 MongoDB
【发布时间】:2011-02-09 21:26:00
【问题描述】:

我在 MongoDB 集合中有几个文档,其中包含一个字段“名称”(它是一个字符串)。

如何执行7 <= name.length <= 14之类的查询

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    您可以使用JavaScript expression

    User.where("this.name.length >= 7 && this.name.length <= 14")
    

    【讨论】:

    • 此查询无效,不会使用索引!
    • 我知道,但它没有要求最有效的方式。最多的方法是添加一个name_lenght属性,每次保存name时计算它,在字段上添加索引并查询该字段。
    【解决方案2】:

    Mongo 提供了几种使用长度标准执行查询的方法——$where$regex 是两个不错的选择,但我建议使用 $regex,因为查询性能更好。


    $where (较慢)

    在查询中接受 JavaScript 表达式或函数

    例子:

    db.collection.find({ $where: 'this.name.length >= 7 && this.name.length <= 14' })
    

    注意:$where 运算符不会利用您的数据库索引,从而导致查询速度慢得多。 - Source


    $regex (更快)

    为查询中的模式匹配字符串提供正则表达式功能

    例子:

    db.collection.find({ name: { $regex: /^.{7,14}$/ } })
    

    注意:$regex 运算符利用您的数据库索引,从而加快查询速度(如果您的集合被正确索引)。 - Source

    【讨论】:

    • @muistooshort,(1) 不正确……即使您没有以 ^ 开始您的模式,仍将使用索引(请参阅 Mongo 关于 Index Use 的注释)。它指出如果正则表达式是“前缀表达式”,则可以进行进一步优化(例如,模式以^ 开头)。(2)我没有对这两个运算符进行基准测试,但根据Mongo's documentation,它指出$regex 使用索引可以比集合扫描更快
    【解决方案3】:

    您可以使用 MongoDB 的 $where 查询参数将 javascript 提交到服务器。例如:

    db.myCollection.find( {$where: "(7 <= this.name.length) && (this.name.length <= 14)"} )
    

    http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D

    【讨论】:

    • 我猜你的意思是 this.name.length 就像上面张贴的 Simone?
    【解决方案4】:

    $where 查询效率不高。 MongoDB

    如果这是一个经常执行的查询,您可能希望将长度存储在单独的字段中。 Denormalization

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      相关资源
      最近更新 更多