合并mongodb子文檔

來源:https://groups.google.com/forum/#!topic/MongoDB-user/BpgEaRqrKsA

創(chuàng)新互聯(lián)是一家以重慶網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、營(yíng)銷推廣、小程序App開發(fā)等移動(dòng)開發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為玻璃隔斷等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。

【摘要】

????????Mongodb 的 BSON 存儲(chǔ)格式靈活多樣,有助于 MongoDB 的入門學(xué)習(xí)。有集算器 SPL 語言支持后,Mongodb 能實(shí)現(xiàn)像數(shù)據(jù) SQL 那樣的方便查詢。

復(fù)制摘要

????????MongoDB文檔的存儲(chǔ)格式是BSON,一種類JSON的二進(jìn)制形式的存儲(chǔ)格式。如果熟悉JSON格式,將非常有助于MongoDB的入門學(xué)習(xí),不過和JSON一樣, BSON結(jié)構(gòu)靈活,組織形式多樣,在提供了強(qiáng)大的數(shù)據(jù)表達(dá)能力的同時(shí),要實(shí)現(xiàn)類似數(shù)據(jù)SQL那樣的方便查詢卻變成了一件非常不容易的事。

????????針對(duì)這個(gè)問題,集算器SPL語言內(nèi)置了豐富的接口,能夠極大地方便用戶使用Mongodb。 下面就用合并內(nèi)嵌子文檔結(jié)構(gòu)的例子來舉例說明。

Collection C1的部分?jǐn)?shù)據(jù)如下:

{
?????? "_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分組,每組數(shù)據(jù)是相同的name對(duì)應(yīng)的子文檔中的users字段,且數(shù)據(jù)不能重復(fù)。最后的計(jì)算結(jié)果類似下面這樣:

{
result : [
?????? {
????????????? ?_id: "ABC",
????????????? ?readUsers : [
???????????????????? ?ObjectId("54f5bfb0336a15084785c393"),
???????????????????? ?ObjectId("54f5bfb0336a15084785c392"),
???????????????????? ObjectId("54f5bfb0336a15084785c398"),
???????????????????? ?ObjectId("54f5bfb0336a15084785c365"),
???????????????????? ObjectId("54f5bfb0336a15084785c370")
????????????? ]
????????????? ?}
]
}

??????使用集算器SPL的代碼如下:


AB
1=mongo_open("mongodb://localhost:27017/local?user=test&password=test")
2=mongo_shell(A1,"c1.find(,{_id:0};{name:1})")
3for 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&…

??????A2: 使用find函數(shù)從MongoDB中取數(shù)并排序,形成游標(biāo):collectoin是c1,過濾條件是空,取出_id之外的所有字段,并按name排序。

??????A3: 循環(huán)從游標(biāo)讀數(shù),每次取name字段相同的一組文檔。A3循環(huán)的作用范圍是縮進(jìn)的B3到B5,在這個(gè)作用范圍內(nèi)可以用A3來引用循環(huán)變量。

??????B3:取出本組文檔的所有users字段,如下:

??????合并 mongodb 子文檔

??????B4:合并本組各文檔的users。

??????B5:將B4去除重復(fù)記錄后不斷地追加到B5中,其中g(shù)roup@1實(shí)現(xiàn)去重處理。B5如下:

??????合并 mongodb 子文檔

??????B5就是本案例的計(jì)算目標(biāo)。如果計(jì)算結(jié)果太多導(dǎo)致內(nèi)存放不下,可以在B5中用函數(shù)export@j將B4轉(zhuǎn)為json串,不斷地追加到文本文件中。

??????A6:關(guān)閉mongodb。

??????MongoDB豐富靈活的存儲(chǔ)結(jié)構(gòu)輕量化、高效性,讓人印象深刻,而集算器能與它天然融合,提高使用效率,擴(kuò)展了應(yīng)用空間。

當(dāng)前標(biāo)題:合并mongodb子文檔
文章起源:http://bm7419.com/article26/gijgcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、服務(wù)器托管搜索引擎優(yōu)化、響應(yīng)式網(wǎng)站、網(wǎng)站導(dǎo)航網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司