2011-06-18 50 views
11

是否有可能表達MongoDB中下面的SQL查詢:通過比較現場發現的mongodb值

SELECT * FROM table AS t WHERE t.field1 > t.filed2; 

編輯: 總結:。

  1. 使用第三個字段存儲「field1 - field2」幾乎是完美的,但需要一點額外的維護。
  2. $其中將在JavaScript中加載和評估,不會使用任何索引。對大數據沒有好處。
  3. 的map/reduce有同樣的問題,並會走線槽中的所有記錄,即使我們只需要一個
+0

我不希望啓動一個火焰戰爭,但天哪,我討厭NOSQL這麼多。 – Blago

+1

那麼如果你不知道在哪裏以及如何正確使用它,就不要使用它。 NoSQL不是關係數據庫的替代品! –

+0

這是我的失望之源。大多數人把它看作是替代品。我看到越來越多的舊(關係)vs現代(noSQL)數據存儲的比較。 – Blago

回答

17

可以使用$where做到這一點:

db.coll.find({ $where: "this.field1 > this.field2" }); 

但是:

的Javascript比 本地運營商執行速度比較慢,但它是非常靈活的

如果根據@yi_H建議的方式,性能是一個更好的問題。

+1

使用$ where不可推薦。 yi_H的答案是正確的! –

+3

@Sentinel:在投票結束之前,你有沒有讀過我的答案?我說,JavaScript工作緩慢,更好地創建@yi_H建議的額外字段。但在任何方式$運營商存在,我絕對相信,它可以用在某些情況下,當性能不是問題。 –

+2

僅當您有一個小集合或使用其他條件(使用索引並返回集合的一個小子集)對集合進行預過濾時,才使用它。 Mongo不知道如何加快這個查詢並執行全表掃描。 –

15

你可以在你的文檔中存儲field1 - field2作爲field3,然後搜索{ field3: { $gt: 0 } }

它也可以使用mapreduce獲得匹配的文檔。

+7

我應該提到你可以存儲布爾值,性能更好。 –

3

您可以使用$ where。只要知道它會很慢(必須在每條記錄上執行Javascript代碼),所以如果可以的話,與索引查詢結合使用。

db.T.find({ $where: function() { return this.Grade1 > this.Grade2 } }); 

或更緊湊:

db.T.find({ $where : "this.Grade1 > this.Grade2" });