網(wǎng)上有很多關(guān)于pos機(jī)參考號(hào)查詢,協(xié)助 mongodb 計(jì)算之子查詢的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)參考號(hào)查詢的問題,今天pos機(jī)之家(www.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
pos機(jī)參考號(hào)查詢
【摘要】 Mongodb 對表數(shù)據(jù)的子查詢計(jì)算不如關(guān)系數(shù)據(jù)庫操作方便,但通過集算器 SPL 語言來實(shí)現(xiàn)就容易多了,不用再擔(dān)心 Mongodb 對子查詢的操作。若想了解更多,請前往乾學(xué)院:協(xié)助 mongodb 計(jì)算之子查詢!
Mongodb日常開發(fā)中,經(jīng)常會(huì)遇到兩個(gè)或多個(gè)數(shù)據(jù)表關(guān)聯(lián)的子查詢問題。若是關(guān)系數(shù)據(jù)庫,其中的子查詢大家相對比較熟悉,實(shí)現(xiàn)也比較容易。但Mongodb對子查詢的支持不夠友好,碰到這些復(fù)雜的運(yùn)算就只能先將數(shù)據(jù)讀出后再計(jì)算,而用java等語言編寫這類計(jì)算也不是很簡單。這時(shí),我們可以考慮用集算器SPL語言輔助實(shí)現(xiàn)子查詢。SPL有豐富的接口及簡潔的語法,能夠極大地方便用戶使用Mongodb,讓子查詢書寫比較規(guī)范統(tǒng)一、效率高效,下面用例子說明。
文檔orders保存了訂單數(shù)據(jù),employee保存了員工數(shù)據(jù),如下:
> db.orders.find();
{"_id" : ObjectId("5434f88dd00ab5276493e270"), "ORDERID" : 1, "CLIENT" : "UJRNP", "SELLERID" : 17, "AMOUNT" : 392, "ORDERDATE" : "2008/11/2 15:28" }
{"_id" : ObjectId("5434f88dd00ab5276493e271"), "ORDERID" : 2, "CLIENT" : "SJCH", "SELLERID" : 6, "AMOUNT" : 4802, "ORDERDATE" : "2008/11/9 15:28" }
{"_id" : ObjectId("5434f88dd00ab5276493e272"), "ORDERID" : 3, "CLIENT" : "UJRNP", "SELLERID" : 16, "AMOUNT" : 13500, "ORDERDATE" : "2008/11/5 15:28" }
{"_id" : ObjectId("5434f88dd00ab5276493e273"), "ORDERID" : 4, "CLIENT" : "PWQ", "SELLERID" : 9, "AMOUNT" : 26100, "ORDERDATE" : "2008/11/8 15:28" }…
> db.employee.find();{"_id" : ObjectId("5437413513bdf2A4048f3480"), "EID" : 1, "NAME" : "Rebecca", "SURNAME" : "Moore", "GENDER" : "F", "STATE" : "California", "BIRTHDAY" : "1974-11-20", "HIREDATE" : "2005-03-11", "DEPT" : "R&D", "SALARY" : 7000 }
{"_id" : ObjectId("5437413513bdf2a4048f3481"), "EID" : 2, "NAME" : "Ashley", "SURNAME" : "Wilson", "GENDER" : "F", "STATE" : "New York", "BIRTHDAY" : "1980-07-19", "HIREDATE" : "2008-03-16", "DEPT" : "Finance", "SALARY" : 11000 }
{"_id" : ObjectId("5437413513bdf2a4048f3482"), "EID" : 3, "NAME" : "Rachel", "SURNAME" : "Johnson", "GENDER" : "F", "STATE" : "New Mexico", "BIRTHDAY" : "1970-12-17", "HIREDATE" : "2010-12-01", "DEPT" : "Sales", "SALARY" : 9000 }…
要求查出訂單信息,其中訂單的SELLERID 必須是employee 集合中STATE= California 的員工id 。如果寫成sql 就是: Select * from orders where orders.sellerid in (select eid from employee where employee.state=’ California’) 。
同時(shí),Orders的數(shù)據(jù)量較大無法一次取出,而employee的數(shù)據(jù)量較小,最終結(jié)果的數(shù)據(jù)量也較小。 使用集算器SPL的代碼如下:
A1: 連接MongoDB,連接字格式為mongo://ip:port/db?arg=value&…。A2: 使用find函數(shù)從orders中取數(shù),形成游標(biāo),過濾條件是空,指定鍵_id不取出。SPL的游標(biāo)是分批讀取和處理數(shù)據(jù),可以避免數(shù)據(jù)量過大,以防內(nèi)存溢出。A3: 取得employee中的數(shù)據(jù),條件是STATE="California"。A4: 將A3(employee)中的EID排序。A5: 按照條件過濾orders數(shù)據(jù),條件是SELLERID必須在A4中,相當(dāng)于SELLERID in A4。其中,函數(shù)pos實(shí)現(xiàn)過濾條件,檢測order的SELLERID值是否存在于employee的EID中。這里一次性取出所有數(shù)據(jù)結(jié)果,如果結(jié)果較大,也可以分批取出,比如取出前1000行:fetch(1000)。計(jì)算結(jié)果是:
A6: 關(guān)閉Mongodb連接。
這個(gè)例子中,A2,A3獲取兩表相關(guān)的數(shù)據(jù),A5中的select獲取符合條件的數(shù)據(jù),實(shí)現(xiàn)表的子查詢。
需要說明的是:集算器esProc并不包含mongodb的java驅(qū)動(dòng)包。如果要用esProc訪問mongodb,必須提前將mongodb的java驅(qū)動(dòng)包(例如:mongo-java-driver-2.12.2.jar)放到集算器設(shè)置的外部庫目錄extLib\\MongoCli下。
除了在集算器中直接計(jì)算,上述使用SPL協(xié)助mongodb計(jì)算的腳本也很容易集成到j(luò)ava中,只要增加一行,寫成return A5即可向java輸出resultset形式的結(jié)果,具體的代碼參考esProc教程。同樣,用java調(diào)用esProc訪問mongodb也必須將mongdb的java驅(qū)動(dòng)包放到j(luò)ava程序的classpath中。
以上就是關(guān)于pos機(jī)參考號(hào)查詢,協(xié)助 mongodb 計(jì)算之子查詢的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)參考號(hào)查詢的知識(shí),希望能夠幫助到大家!
