【发布时间】:2011-02-09 21:26:00
【问题描述】:
我在 MongoDB 集合中有几个文档,其中包含一个字段“名称”(它是一个字符串)。
如何执行7 <= name.length <= 14之类的查询
【问题讨论】:
标签: ruby-on-rails mongodb mongoid
我在 MongoDB 集合中有几个文档,其中包含一个字段“名称”(它是一个字符串)。
如何执行7 <= name.length <= 14之类的查询
【问题讨论】:
标签: ruby-on-rails mongodb mongoid
您可以使用JavaScript expression。
User.where("this.name.length >= 7 && this.name.length <= 14")
【讨论】:
name_lenght属性,每次保存name时计算它,在字段上添加索引并查询该字段。
Mongo 提供了几种使用长度标准执行查询的方法——$where 或 $regex 是两个不错的选择,但我建议使用 $regex,因为查询性能更好。
$where (较慢)
例子:
db.collection.find({ $where: 'this.name.length >= 7 && this.name.length <= 14' })
注意:$where 运算符不会利用您的数据库索引,从而导致查询速度慢得多。 - Source
$regex (更快)
例子:
db.collection.find({ name: { $regex: /^.{7,14}$/ } })
注意:$regex 运算符将利用您的数据库索引,从而加快查询速度(如果您的集合被正确索引)。 - Source
【讨论】:
^ 开始您的模式,仍将使用索引(请参阅 Mongo 关于 Index Use 的注释)。它指出如果正则表达式是“前缀表达式”,则可以进行进一步优化(例如,模式以^ 开头)。(2)我没有对这两个运算符进行基准测试,但根据Mongo's documentation,它指出$regex 使用索引可以比集合扫描更快。
您可以使用 MongoDB 的 $where 查询参数将 javascript 提交到服务器。例如:
db.myCollection.find( {$where: "(7 <= this.name.length) && (this.name.length <= 14)"} )
【讨论】:
this.name.length 就像上面张贴的 Simone?
$where 查询效率不高。 MongoDB
如果这是一个经常执行的查询,您可能希望将长度存储在单独的字段中。 Denormalization
【讨论】: