I一直在使用MongoDB和Ruby驅動程序和Mongoid,並且行
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
看起來很奇怪,很難記住。爲什麼不使用解析器:
db.things.find("j != 3 && k > 10")
哪能自動轉換成它想要的形式? (或內部使用的任何形式)。
I一直在使用MongoDB和Ruby驅動程序和Mongoid,並且行
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
看起來很奇怪,很難記住。爲什麼不使用解析器:
db.things.find("j != 3 && k > 10")
哪能自動轉換成它想要的形式? (或內部使用的任何形式)。
MongoDB支持JavaScript expressions in find()
statements。請注意:
Javascript執行速度比本機運行速度慢,但非常靈活。
將JavaScript表達式字符串解析爲實際的JavaScript一次,然後對每個文檔進行評估。
但是,JavaScript並未轉換爲本地運營商,如{ $ne: 3 }
。原因是並非所有的JavaScript都可以使用本地運營商來表示。
因爲它不能將表達式轉換爲本地運算符,它(可能)也不知道要使用哪些索引。因此,JavaScript表達式可能比本地運算符稍慢。
我想象它可以解析一次並在查詢中使用它。解析一次應該非常快,甚至不明顯? – 2010-09-25 07:46:19
解析不是問題。 JS會針對每個文檔進行評估,不會使用索引。這不是一個翻譯成一個等價的內部查詢與$ ne/$ gt ... – Thilo 2010-09-25 08:10:53
@Jin Lin:分析完成一次,但沒有轉換髮生。看到我更新的答案。 – 2010-09-25 08:11:17
作爲替代方案,實現具有流暢接口的查詢生成器不會太困難。不知道如果Ruby驅動程序已經包含一個,但Java版本有
DBObject condObj =
QueryBuilder.start("numberOfPageHits").greaterThan(10)
.and("name").regex(regExp).get();
謝謝,我正在尋找。 – theTuxRacer 2010-10-28 06:33:12
看看http://github.com/RedBeard0531/MongoMagic。它用python編寫,但應該很容易翻譯成ruby。您的查詢看起來是這樣的:
db.things.find(AND(M.j != 3 , M.k > 10))
這不是一個問題,那是一個功能請求。把它放在他們的問題追蹤器上。 – Thilo 2010-09-25 07:13:51
我在問爲什麼,爲什麼不,或者任何可能的方式,正如Niels指出的,實際上有這樣一種方法。 – 2010-09-25 07:48:26
我不確定Niels方法是你想要的。 JS表達式不會轉換爲內部查詢語法,而是會針對每個文檔進行評估。索引不能使用,所以這會很慢。 – Thilo 2010-09-25 08:09:43