溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

合并 mongodb 子文檔

發(fā)布時(shí)間:2020-07-18 05:51:10 來(lái)源:網(wǎng)絡(luò) 閱讀:217 作者:raqsoft 欄目:大數(shù)據(jù)

來(lái)源:https://groups.google.com/forum/#!topic/mongodb-user/BpgEaRqrKsA


【摘要】

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

復(fù)制摘要

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

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

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é)果類(lèi)似下面這樣:

{
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,過(guò)濾條件是空,取出_id之外的所有字段,并按name排序。

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


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI