mongodb的join操作簡析

2021-12-30 06:53:59 字數 1086 閱讀 7836

眾所周知,mongodb是不支援join操作的,因此我們只能自己來實現這個功能。前段時間,我遇到這個乙個業務場景:

collection a 的資料格式:

, "value" : 1 }

collection b 的資料格式:  www.2cto.com  

a表的資料量為2w,b表的資料量為25w。為了說明簡單,我簡化下需求,就是計算a._id.username = b.username 的b表中的使用者資料,也就是求a和b的交集。沒有join,怎麼辦呢?

相信大家都應該有自己的解答了,由於a表的資料量相對於b表來講是少的,所以可以先取出a表的所有資料,然後去b表查詢,看那些資料同時存在於a和b表中。當然在mongodb中對a和b建立適當的索引是非常必要的。我採用的方法是對b表的username欄位進行索引。

如對mongodb索引不了解,可以參見**教程《mongodb的索引使用及索引機制》(一文。

這裡我使用的語言是nodejs,node_module採用的mongoskin,我剛開始寫了乙個簡單的實現:

db.a.find({}, {}, function(err, adata);

//檢視b表中這條資料

db.b.findone(op, {}, function(err, data)

if (allcount === len)  })}

})})      這段**是能滿足業務需求,但大家有沒有發現它存在乙個致命的問題?對,執行速度慢!

原因很簡單,我是從a表中批量取到所有資料,然後又用findone方法一條條去b表中查詢,a表中有2w資料,也就是要查b表2w次,雖然b表中已經建立索引,但這樣的查詢邏輯明顯是不可接受。

知道問題所在,解決方案也就清楚了:對b表進行批量查詢:

db.a.find({}, {}, function(err, adata)

var op = };

//檢視b表中這條資料  www.2cto.com  

db.b.find(op, {}, function(err, bdata))

})})

})     經過這樣的優化,程式效能會有明顯的提公升。

希望對大家有所幫助。  

作者 朱佳墩

MongoDB公升級操作簡析

1.首先備份資料到另一台機器上 上面描述了幾種備份的情況。服務不停備份 服務停止備份 我這次備份只是防止萬一,比較簡單,可以在服務執行的情況下備份。plain mongodump h ip d kaimei o kaimei bk 上面的命令執行子我自己的電腦上,也安裝了mongodb,會從ip位址...

Hive中的Join操作

hive中有許多的join操作,如果left,right和full outer join,inner join,left semi join等。那麼它們都各自有什麼特點呢?感覺很難說明這些區別,還是通過例子來看。如果我們有乙個表,資料如下 a.txt 1,a 2,b3,c 4,d7,y 8,u另乙個...

windows上mongoDB的安裝和簡單使用

windows上mongodb的安裝和簡單使用 windows上安裝 附乙個簡單的教程 安裝完成後 1 建立幾個資料夾具體如下 資料庫路徑 data目錄 日誌路徑 log目錄 和日誌檔案 mongo.log檔案 建立配置檔案mongo.conf,檔案內容如下 資料庫路徑 view plain cop...