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

Java怎樣查詢統(tǒng)計MongoDB的數(shù)據(jù)

可以用官方的Json風格的語法查詢或統(tǒng)計MongoDB,優(yōu)點是穩(wěn)定可靠,缺點是語法古怪難掌握,很多基本計算都不支持,計算能力一般,而且代碼非常繁瑣 。另一種方法是使用函數(shù)式編程風格的Hibernate Criteria,優(yōu)點是更接近自然語言,易于理解,缺點是架構(gòu)沉重且計算能力弱 。還有一種方法,使用支持通用SQL的Calcite,優(yōu)點是學習成本低,缺點是計算能力非常弱,且配置很麻煩,還要對collection進行結(jié)構(gòu)性改造 。更好的方法是使用開源類庫集算器SPL,不僅計算能力非常強而且容易掌握,也不需要改造collection,集成架構(gòu)很輕便,配置起來也簡單 。SPL提供了易用的JDBC接口,初學者可以快速入門 。比如某collection存儲多條雇員記錄,每個雇員的Orders字段存儲多條訂單記錄 。下面對所有的訂單進行條件查詢:

Class.forName("com.esproc.jdbc.InternalDriver");Connection connection=DriverManager.getConnection("jdbc:esproc:local://");Statement statement =connection.createStatement();String str="= mongo_shell@x(mongo_open("mongodb://127.0.0.1:27017/mongo"),"test1.find()").fetch().conj(Orders).select(Amount>1000 && Amount<=3000 &&like@c(Client,"*s*"))";ResultSet result =statement.executeQuery(str);SPL支持算法外置于JAVA代碼,可大幅減低代碼耦合性,特別適合計算代碼較長或頻繁修改的情況 。比如上面的條件查詢,可以先將計算代碼存為SPL腳本文件:

A1=mongo_open("mongodb://127.0.0.1:27017/mongo")2=mongo_shell@x(A1,"data.find()").fetch()3=A2.conj(Orders).select(Amount>1000 &&Amount<=3000 && like@c(Client,"*s*"))再在JAVA代碼中以存儲過程的形式調(diào)用SPL腳本文件名:
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內(nèi)置豐富的計算函數(shù),提供了等價于SQL的計算能力 。下面再舉幾例:

AB3…
4=A2.conj(Orders).groups(year(OrderDate);sum(Amount))//對訂單分組匯總5=A2.groups(Dept,Gender;count(1))//對員工分組匯總6=A2.sort(Dept,-Salary)//排序7=A2.id(State)//去重SPL甚至提供了SOL語法,以方便數(shù)據(jù)庫程序員 。比如前面的條件查詢可以改成下面的SQL:
$select OrderId, Client, Amount, OrderDate from {A2.conj()} where Clientlike '%S%' or (Amount>1000 and Amount<=2000)SPL提供了簡單易用的關聯(lián)函數(shù),可彌補MongoDB和其他幾種計算類庫的弱點 。比如,對同一個collection里的員工和訂單進行關聯(liá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)再比如,兩個collection是主子關系,要進行左關聯(lián),只需如下代碼:

AB1=mongo_open("mongodb://127.0.0.1:27017/mongo")2=mongo_shell@x(A1,"main.find()").fetch()=mongo_shell@x(A1,"detail.find()").fethc()3=join@1(B2,cat;A2,cat)
4=A3.new(_1.title,_1.regex,_1.cat,_2.path)SPL的語法體系表達能力強,很多SQL和存儲過程都難以實現(xiàn)的計算,用SPL可以輕松解決 。比如,計算某支股票最長的連續(xù)上漲天數(shù),SPL的實際計算代碼只有一行:

A1=mongo_open("mongodb://127.0.0.1:27017/mongo")2=mongo_shell(A1,"share.find()").fetch()3=a=0,A2.max(a=if(price>price[-1],a+1,0))SPL支持多層數(shù)據(jù)對象,特別適合計算MongoDB里的多層Json數(shù)據(jù) 。比如,對于下面的collection,統(tǒng)計每條記錄中 income,output 的數(shù)量之和:

推薦閱讀