2010-09-25 44 views
0

I一直在使用MongoDB和Ruby驅動程序和Mongoid,並且行

db.things.find({j: {$ne: 3}, k: {$gt: 10} }); 

看起來很奇怪,很難記住。爲什麼不使用解析器:

db.things.find("j != 3 && k > 10") 

哪能自動轉換成它想要的形式? (或內部使用的任何形式)。

+0

這不是一個問題,那是一個功能請求。把它放在他們的問題追蹤器上。 – Thilo 2010-09-25 07:13:51

+0

我在問爲什麼,爲什麼不,或者任何可能的方式,正如Niels指出的,實際上有這樣一種方法。 – 2010-09-25 07:48:26

+0

我不確定Niels方法是你想要的。 JS表達式不會轉換爲內部查詢語法,而是會針對每個文檔進行評估。索引不能使用,所以這會很慢。 – Thilo 2010-09-25 08:09:43

回答

1

MongoDB支持JavaScript expressions in find() statements。請注意:

Javascript執行速度比本機運行速度慢,但非常靈活。

將JavaScript表達式字符串解析爲實際的JavaScript一次,然後對每個文檔進行評估。

但是,JavaScript並未轉換爲本地運營商,如{ $ne: 3 }。原因是並非所有的JavaScript都可以使用本地運營商來表示。

因爲它不能將表達式轉換爲本地運算符,它(可能)也不知道要使用哪些索引。因此,JavaScript表達式可能比本地運算符稍慢。

+0

我想象它可以解析一次並在查詢中使用它。解析一次應該非常快,甚至不明顯? – 2010-09-25 07:46:19

+0

解析不是問題。 JS會針對每個文檔進行評估,不會使用索引。這不是一個翻譯成一個等價的內部查詢與$ ne/$ gt ... – Thilo 2010-09-25 08:10:53

+0

@Jin Lin:分析完成一次​​,但沒有轉換髮生。看到我更新的答案。 – 2010-09-25 08:11:17

2

作爲替代方案,實現具有流暢接口的查詢生成器不會太困難。不知道如果Ruby驅動程序已經包含一個,但Java版本有

DBObject condObj = 
    QueryBuilder.start("numberOfPageHits").greaterThan(10) 
     .and("name").regex(regExp).get(); 
+0

謝謝,我正在尋找。 – theTuxRacer 2010-10-28 06:33:12

相關問題