在 Mongodb 應(yīng)用中,經(jīng)常會(huì)在 List 結(jié)構(gòu)中存入由若干字段組合而成的字符串?dāng)?shù)據(jù)。這種方式對于 Mongodb 的管理比較方便,如大量導(dǎo)入導(dǎo)出數(shù)據(jù)時(shí),不用關(guān)注數(shù)據(jù)與字段的對齊問題,導(dǎo)入導(dǎo)出數(shù)據(jù)也比較快。不過,事物的特性往往存在兩方面,有利有弊,這種方式在遇到統(tǒng)計(jì)計(jì)算需求時(shí),就需要將字符串進(jìn)行拆分,同時(shí)轉(zhuǎn)換數(shù)據(jù)類型,再進(jìn)行數(shù)據(jù)計(jì)算。這時(shí)用 mongodb shell 操作就比較麻煩了,而集算器 SPL 語言擁有豐富的接口函數(shù),實(shí)現(xiàn)就容易多了?,F(xiàn)在我們通過樣例來看看如何實(shí)現(xiàn)。 Collction Cbettwen含有多級子文檔,其中 dataList 是 List 型,含有多個(gè)字符串,每個(gè)字符串由多個(gè)數(shù)字組成。需要找出符合如下條件的字符串:第 1 個(gè)數(shù)字大于 6154 并小于等于6155。 Cbettwen
的某個(gè)文檔如下:{ "_id" : ObjectId("54f6a766bf4436333edcd6a2"), "_class" : "com.abc.core.bo.obj.Objs", "objList" : [ { "name" : "ABB-09", "uid" : "ABB-09", "data" : { "dataId" : NumberLong(0), "dataList" : [ "6150,32.9,1.475,,1.434", "6150.5,43,,1.529,1.402", "6151,31.8,1.506,1.447,1.453", "6151.5,33.6,1.481,1.456,1.521", "6152,30.9,1.465,1.472,1.547", "6152.5,39.5,1.404,1.425,1.485", "6153,43.2,1.406,1.446,1.481", "6153.5,39.5,1.433,1.468,1.488", "6154,32.7,1.459,1.477,1.427", "6154.5,37.9,1.529,1.429,1.429", "6155,30.4,1.505,1.532,1.543", "6155.5,37.3,1.49,1.436,1.462", "6156,35.3,1.538,1.45,1.488", "6156.5,37.3,1.517,1.535,1.473", "6157,32.7,1.401,1.405,1.497", "6157.5,38.9,1.488,1.468,1.499", "6158,35.4,1.526,1.422,1.452", "6158.5,43.3,1.516,1.433,1.491", "6159,34.6,1.519,1.442,1.478", "6159.5,42.7,1.426,1.514,1.428", "6160,32.7,1.451,1.5,1.516" ] } } ] } |
符合要求的字符串為:"6154.5,37.9,1.529,1.429,1.429","6155,30.4,1.505,1.532,1.543"。 集算器代碼:
| A | 1 | =mongo_open("mongodb:// localhost:27017/local?user=test&password=test") | 2 | =mongo_shell(A1,"Cbettwen.find(,{_id:0})") | 3 | =A2.conj((t=~.objList.data.dataList.new(~),t.select((s=float(#1.split@c()(1)),s>6154 && s<=6155)))) | 4 | =A3.fetch() | 5 | =mongo_close(A1) |
A1:連接MongoDB,連接字格式為mongo://ip:port/db?arg=value&…。 A2:使用find函數(shù)從MongoDB中取數(shù),形成游標(biāo)。collection是Cbettwen,過濾條件是空,取出_id之外的所有字段。 A3:找到符合條件的字符串。函數(shù)conj可對A2中每個(gè)文檔的計(jì)算結(jié)果進(jìn)行合并,~表示上級序表的每個(gè)成員。函數(shù)new可新建序表。#1表示序表的第1個(gè)字段。函數(shù)split可將字符串拆為序列,默認(rèn)分隔符是逗號,@1表示只拆成兩個(gè)成員,遇到第1個(gè)分隔符就返回。s表示將首個(gè)字符串轉(zhuǎn)換成float類型的數(shù)值,然后進(jìn)行比較篩選。 A4: 對游標(biāo)進(jìn)行批處理,獲得內(nèi)存數(shù)據(jù),結(jié)果如下: 6154.5,37.9,1.529,1.429,1.429 | 6155,30.4,1.505,1.532,1.543 | 6154.6,100.9,1.529,1.429,1.429 | 6154.7,200.9,1.529,1.429,1.429 | 6155,100.3,1.49,1.436,1.462 | 6155,200.3,1.49,1.436,1.462 | 6154.6,300.9,1.529,1.429,1.429 | 6154.7,400.9,1.529,1.429,1.429 | 6155,300.3,1.49,1.436,1.462 | 6155,400.3,1.49,1.436,1.462 | 6154.6,500.9,1.529,1.429,1.429 | 6154.7,600.9,1.529,1.429,1.429 | 6155,500.3,1.49,1.436,1.462 |
A5:關(guān)閉mongodb連接。 可以看見,SPL語言的實(shí)現(xiàn)相對mongodb來說,更加精簡容易。
|