NoSQLBooster for MongoDB 中跨库关联查询
? 使用 MongoDB 是我們常常會(huì)遇到一些特殊的需求需要跨庫(kù)關(guān)聯(lián)查詢,比如訂單明細(xì)缺商品重量需要補(bǔ)商品重量,而商品重量數(shù)據(jù)又在商品庫(kù)中,這事就需要跨庫(kù)關(guān)聯(lián)操作,示例代碼如下:
// 使用 order 庫(kù),注意語(yǔ)句后面不要加分號(hào) use ordervar count = 0; db.order_detail.find({"store_code":"110"}).forEach(function(_order){// 在 goods 庫(kù)查詢 item 集合var item = db.getSiblingDB("goods").item.findOne({"barcode":_order.barcode});if(item){db.order_detail.update({_id:_order._id},{$set:{"weight":item.weight}},false,true);count++;}else{print("商品不存在, 條碼:" + _order.barcode);} }); print("更新條數(shù):" + count);注意:跨庫(kù)查詢時(shí)必須使用 admin 庫(kù)來(lái)授權(quán)連接操作。
? 上面示例的代碼,數(shù)量不多時(shí)還能勉強(qiáng)湊合著使用。當(dāng)數(shù)據(jù)量達(dá)到上萬(wàn)條數(shù)據(jù)時(shí)就顯示非常非常慢。因?yàn)楦乱粭l數(shù)據(jù)需要單條 findOne 再單條 update。因此得優(yōu)化,將單條查詢改批量查詢(緩存查詢結(jié)果),示例代碼如下:
use ordervar count = 0; var items = {}; db.getSiblingDB("goods").item.find({"store_code":"110"}).forEach(function(_item){// items 當(dāng)做 map 使用, key 商品條碼(barcode)items[_item.barcode] = _item; }); db.order_detail.find({"store_code":"110"}).forEach(function(_order){var item = items[_order.barcode];if(item){db.order_detail.update({_id:_order._id},{$set:{"weight":item.weight}},false,true);count++;}else{print("商品不存在, 條碼:" + _order.barcode);} }); print("更新條數(shù):" + count);? 經(jīng)過(guò)將單條查詢改成批量查詢后執(zhí)行效率確實(shí)提升不少,但是還是覺(jué)得慢,還得繼續(xù)優(yōu)化,將單條更新改成批量更新,示例代碼如下:
use ordervar count = 0; var items = {}; db.getSiblingDB("goods").item.find({"store_code":"110"}).forEach(function(_item){items[_item.barcode] = _item; }); var ops = []; db.order_detail.find({"store_code":"110"}).forEach(function(_order){var item = items[_order.barcode];if(item){var f = {_id:_order._id};var upd = {$set:{"weight":item.weight}};ops.push({"updateMany":{"filter":f, "update":upd, "upsert":false}});count++;}else{print("商品不存在, 條碼:" + _order.barcode);}if(count > 0 && count % 1000 == 0){// 批量更新, ordered:false 無(wú)序操作db.order_detail.bulkWrite(ops, {ordered:false});ops = [];print("更新條數(shù):" + count);} });if(ops.length > 0){db.order_detail.bulkWrite(ops, {ordered:false}); } print("更新完成,更新總條數(shù):" + count);批量操作參見(jiàn): http://www.xuexiyuan.cn/article/detail/173.html
原文地址:https://xuexiyuan.cn/article/detail/204.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的NoSQLBooster for MongoDB 中跨库关联查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 银价多少钱啊?
- 下一篇: groovy怎样从sql语句中截取表名_