是否有可能表達MongoDB中下面的SQL查詢:通過比較現場發現的mongodb值
SELECT * FROM table AS t WHERE t.field1 > t.filed2;
編輯: 總結:。
- 使用第三個字段存儲「field1 - field2」幾乎是完美的,但需要一點額外的維護。
- $其中將在JavaScript中加載和評估,不會使用任何索引。對大數據沒有好處。
- 的map/reduce有同樣的問題,並會走線槽中的所有記錄,即使我們只需要一個
是否有可能表達MongoDB中下面的SQL查詢:通過比較現場發現的mongodb值
SELECT * FROM table AS t WHERE t.field1 > t.filed2;
編輯: 總結:。
可以使用$where做到這一點:
db.coll.find({ $where: "this.field1 > this.field2" });
但是:
的Javascript比 本地運營商執行速度比較慢,但它是非常靈活的
如果根據@yi_H建議的方式,性能是一個更好的問題。
使用$ where不可推薦。 yi_H的答案是正確的! –
@Sentinel:在投票結束之前,你有沒有讀過我的答案?我說,JavaScript工作緩慢,更好地創建@yi_H建議的額外字段。但在任何方式$運營商存在,我絕對相信,它可以用在某些情況下,當性能不是問題。 –
僅當您有一個小集合或使用其他條件(使用索引並返回集合的一個小子集)對集合進行預過濾時,才使用它。 Mongo不知道如何加快這個查詢並執行全表掃描。 –
你可以在你的文檔中存儲field1 - field2
作爲field3
,然後搜索{ field3: { $gt: 0 } }
它也可以使用mapreduce獲得匹配的文檔。
我應該提到你可以存儲布爾值,性能更好。 –
您可以使用$ where。只要知道它會很慢(必須在每條記錄上執行Javascript代碼),所以如果可以的話,與索引查詢結合使用。
db.T.find({ $where: function() { return this.Grade1 > this.Grade2 } });
或更緊湊:
db.T.find({ $where : "this.Grade1 > this.Grade2" });
我不希望啓動一個火焰戰爭,但天哪,我討厭NOSQL這麼多。 – Blago
那麼如果你不知道在哪裏以及如何正確使用它,就不要使用它。 NoSQL不是關係數據庫的替代品! –
這是我的失望之源。大多數人把它看作是替代品。我看到越來越多的舊(關係)vs現代(noSQL)數據存儲的比較。 – Blago