日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Java怎樣對(duì)MongoDB執(zhí)行SQL

開啟MongoDB的Connector服務(wù)后,可以通過MySQL JDBC執(zhí)行SQL 。官方工具的優(yōu)點(diǎn)是適配性極佳,幾乎無須配置就能使用,缺點(diǎn)是計(jì)算能力較弱,所以官方給的建議是只限于BI工具中使用 。使用Calcite類庫(kù)也可以在MongoDB上執(zhí)行通用SQL,優(yōu)點(diǎn)是遷移性極佳,缺點(diǎn)是計(jì)算能力非常弱,連模糊查詢和日期函數(shù)都不支持;所有的多層collection都要改造成單層,否則有些計(jì)算沒法實(shí)現(xiàn);另外就是配置很麻煩 。更好的方法是使用開源的集算器SPL,原理和Calcite有點(diǎn)像,也是在MongDB上執(zhí)行通用SQL,但SPL的計(jì)算能力非常強(qiáng)大,且無須改造MongoDB,也沒有麻煩的配置 。SPL基本用法簡(jiǎn)單 。比如某collection是兩層結(jié)構(gòu),上層存儲(chǔ)多條員工記錄,其中Orders字段為數(shù)組類型,用來存儲(chǔ)當(dāng)前員工的多個(gè)訂單 。對(duì)下層的訂單進(jìn)行條件查詢,只需如下JAVA代碼:

Class.forName("com.esproc.jdbc.InternalDriver");Connection connection=DriverManager.getConnection("jdbc:esproc:local://");Statement statement =connection.createStatement();String str="$select * from {mongo_shell@x(A1,mongo_open(\"mongodb://127.0.0.1:27017/mongo\"),\"data.find()\").conj(Orders)}where Client like '%S%' or (Amount>1000 and Amount<=2000)";ResultSet result =statement.executeQuery(str);SPL支持計(jì)算代碼外置,可顯著降低代碼耦合性,尤其適合代碼較長(zhǎng)或頻繁修改的情況 。比如上面的條件查詢,可先將計(jì)算代碼存儲(chǔ)為SPL腳本文件:


A1=mongo_open("mongodb://127.0.0.1:27017/mongo")2=mongo_shell@x(A1,"data.find()")3=A2.conj(Orders)4$select * from {A3} where Client like'%S%' or (Amount>1000 and Amount<=2000)在JAVA中調(diào)用時(shí),只需以存儲(chǔ)過程的形式引用腳本文件名:
Class.forName("com.esproc.jdbc.InternalDriver");Connection connection=DriverManager.getConnection("jdbc:esproc:local://");Statement statement =connection.createStatement();String str="callcondition()";ResultSet result = statement.executeQuery(str);SPL 支持常見的SQL語法,可實(shí)現(xiàn)各類日常計(jì)算,下面舉一些例子:
#sort$select * from {A3} order by Client,Amont desc#group by$ select year(orderdate) y,sum(amount) s from {A3}group by year(orderdate) having sum(amount)>=2000000#distinct$ select distinct(sellerid) from {A3}【Java怎樣對(duì)MongoDB執(zhí)行SQL】SPL支持高級(jí)SQL語法,可實(shí)現(xiàn)難度較大的計(jì)算,比如集合計(jì)算、case when、with、嵌套子查詢等,詳見《在文件上使用 SQL 查詢的示例》
上面SQL中的{…}是SPL擴(kuò)展函數(shù),擴(kuò)展函數(shù)具有SQL等價(jià)的計(jì)算能力,而且代碼普遍更簡(jiǎn)練 。比如關(guān)聯(lián)查詢,不用SQL而直接用擴(kuò)展函數(shù)實(shí)現(xiàn):
A1=mongo_open("mongodb://127.0.0.1:27017/mongo")2=mongo_shell(A1,"data.find()").fetch()3=A2.new(Orders.OrderID,Orders.Client,Name,Gender,Dept)SPL擴(kuò)展函數(shù)可以簡(jiǎn)化復(fù)雜的計(jì)算邏輯 。比如:計(jì)算某支股票最長(zhǎng)的連續(xù)上漲天數(shù),只需兩行代碼:

A1=mongo_open("mongodb://127.0.0.1:27017/mongo")2=mongo_shell(A1,"share.find()").fetch()3=a=0,A1.max(a=if(price>price[-1],a+1,0))MongoDB經(jīng)常用來存儲(chǔ)Json,而SQL只適合計(jì)算結(jié)構(gòu)化記錄,不適合計(jì)算多層json 。SPL的數(shù)據(jù)對(duì)象本身就是多層的,特別擅長(zhǎng)簡(jiǎn)化多層json的計(jì)算 。比如,對(duì)于下面的collection,統(tǒng)計(jì)每條記錄中 income,output 的數(shù)量之和:

推薦閱讀