來源:https://groups.google.com/forum/#!topic/mongodb-user/BpgEaRqrKsAmongodb
【摘要】
Mongodb 的 BSON 存儲格式靈活多樣,有助於 MongoDB 的入門學習。有集算器 SPL 語言支持後,Mongodb 能實現像數據 SQL 那樣的方便查詢。
shell
複製摘要json
MongoDB文檔的存儲格式是BSON,一種類JSON的二進制形式的存儲格式。若是熟悉JSON格式,將很是有助於MongoDB的入門學習,不過和JSON同樣, BSON結構靈活,組織形式多樣,在提供了強大的數據表達能力的同時,要實現相似數據SQL那樣的方便查詢卻變成了一件很是不容易的事。app
針對這個問題,集算器SPL語言內置了豐富的接口,可以極大地方便用戶使用Mongodb。 下面就用合併內嵌子文檔結構的例子來舉例說明。ide
Collection C1的部分數據以下:函數
{ "_id" : ObjectId("55014006e4b0333c9531043e"),, "acls" : { "append" : { "users" : [ObjectId("54f5bfb0336a15084785c393") ], "groups" : [ ] }, "edit" : { "groups" : [ ], "users" : [ ObjectId("54f5bfb0336a15084785c392") ] }, "fullControl" : { "users" : [ ], "groups" : [ ] }, "read" : { "users" : [ ObjectId("54f5bfb0336a15084785c392"), ObjectId("54f5bfb0336a15084785c398")], "groups" : [ ] } }, name: "ABC" } { "_id" : ObjectId("55014006e4b0333c9531043f"), "acls" : { "append" : { "users" : [ObjectId("54f5bfb0336a15084785c365") ], "groups" : [ ] }, "edit" : { "groups" : [ ], "users" : [ ObjectId("54f5bfb0336a15084785c392") ] }, "fullControl" : { "users" : [ ], "groups" : [ ] }, "read" : { "users" : [ObjectId("54f5bfb0336a15084785c392"), ObjectId("54f5bfb0336a15084785c370")], "groups" : [ ] } }, name: "ABC" } |
要求按name分組,每組數據是相同的name對應的子文檔中的users字段,且數據不能重複。最後的計算結果相似下面這樣:學習
{ result : [ { _id: "ABC", readUsers : [ ObjectId("54f5bfb0336a15084785c393"), ObjectId("54f5bfb0336a15084785c392"), ObjectId("54f5bfb0336a15084785c398"), ObjectId("54f5bfb0336a15084785c365"), ObjectId("54f5bfb0336a15084785c370") ] } ] } |
使用集算器SPL的代碼以下:google
A | B | ||
1 | =mongo_open("mongodb://localhost:27017/local?user=test&password=test") | ||
2 | =mongo_shell(A1,"c1.find(,{_id:0};{name:1})") | ||
3 | for A2;name | =A3.(acls.read.users|acls.append.users|acls.edit.users|acls.fullControl.users) | |
4 | =B3.new(A3.name:_id,B3.union().id():readUsers) | ||
5 | =@|B4.group@1(~._id,~.readUsers) | ||
6 | =mongo_close(A1) |
A1:鏈接MongoDB,鏈接字格式爲mongo://ip:port/db?arg=value&…spa
A2: 使用find函數從MongoDB中取數並排序,造成遊標:collectoin是c1,過濾條件是空,取出_id以外的全部字段,並按name排序。3d
A3: 循環從遊標讀數,每次取name字段相同的一組文檔。A3循環的做用範圍是縮進的B3到B5,在這個做用範圍內能夠用A3來引用循環變量。
B3:取出本組文檔的全部users字段,以下:
B4:合併本組各文檔的users。
B5:將B4去除重複記錄後不斷地追加到B5中,其中group@1實現去重處理。B5以下:
B5就是本案例的計算目標。若是計算結果太多致使內存放不下,能夠在B5中用函數export@j將B4轉爲json串,不斷地追加到文本文件中。
A6:關閉mongodb。
MongoDB豐富靈活的存儲結構輕量化、高效性,讓人印象深入,而集算器能與它自然融合,提升使用效率,擴展了應用空間。