我一直在使用 MongoDB 和 Ruby 驱动程序和 Mongoid,以及行
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
只是看起来很奇怪,很难记住。为什么不使用解析器:
db.things.find("j != 3 && k > 10")
哪个可以自动转换为所需的形式?(或它在内部使用的任何形式)。
作为替代方案,实现具有流畅界面的查询构建器不会太困难。不确定 Ruby 驱动程序是否已经包含一个,但 Java 版本有
DBObject condObj =
QueryBuilder.start("numberOfPageHits").greaterThan(10)
.and("name").regex(regExp).get();
看看http://github.com/RedBeard0531/MongoMagic。它是用 python 编写的,但应该很容易翻译成 ruby。您的查询将如下所示:
db.things.find(AND( M.j != 3 , M.k > 10 ))
MongoDB 支持语句中的 JavaScript 表达式find()
。请注意:
Javascript 的执行速度比本地运算符慢 [...] 但非常灵活。
JavaScript 表达式字符串被解析为实际的 JavaScript 一次,然后针对每个文档进行评估。
但是,JavaScript 不会转换为原生运算符,例如{ $ne: 3 }
. 原因是不是所有的 JavaScript 都可以使用本地操作符来表达。
因为它无法将表达式转换为本机运算符,所以它(可能)也不知道要使用哪些索引。因此,JavaScript 表达式可能比原生运算符慢一些。