NoSQLBooster for MongoDB 中跨库关联查询
使用 MongoDB 是我们常常会遇到一些特殊的需求需要跨库关联查询,比如订单明细缺商品重量需要补商品重量,而商品重量数据又在商品库中,这事就需要跨库关联操作,示例代码如下:
// 使用 order 库,注意语句后面不要加分号
use order
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
var count = ;
db.order_detail.find({“store_code”:”110″}).forEach(function(_order){
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(“更新条数:” + count);
注意:跨库查询时必须使用 admin 库来授权连接。
上面示例的代码,数量不多时还能勉强凑合着使用。当数据量达到上万条数据时就显示非常非常慢。因为更新一条QQ账号数据需要单条 findOne 在单条 update。因此得优化,将单条查询改批量查询(缓存查询结果),示例代码如下:
use order
var count = ;
var items = {};
db.getSiblingDB(“item”).goods.find({“store_code”:”110″}).forEach(function(_item){
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(“更新条数:” + count);
进过将单条查询改成批量查询后执行效率确实提升不少,但是还是觉得慢,还得继续优化,将单条更新改成批量更新,示例代码如下:
use order
var count = ;
var items = {};
db.getSiblingDB(“item”).goods({“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 > && count % 1000 == ){ // 批量更新, ordered:false 无序操作 db.order_detail.bulkWrite(ops, {ordered:false}); ops = []; print("更新条数:" + count); }
});
if(ops.length > ){
db.order_detail.bulkWrite(ops, {ordered:false});
}
print(“更新完成,更新总条数:” + count);
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- 面向前端与未来标准的Node.js Web 框架再进化
- Debian 终于开始讨论非自由固件镜像了
- 即使对那些不知道 Markdown 的人来说,Marktext 也是一个绝佳的编辑器
- 在项目中用 TS 封装 axios ,一次封装团队受益
- 基于多模态信息融合的上肢康复训练评估系统
- 如何在 Linux 下使用 TC 优雅的实现网络限流
- Linux命令lsscsi详解
- 如何在 Ubuntu 20.04 LTS 上安装 Lighttpd、PHP 和 MariaDB
- 还不知道鸿蒙OS底层实现?老司机带你走进微内核
- 五个需要关注的 GNOME 43 功能
- 基于数字孪生的源网荷储多能互补智慧微网系统
- Bash 中的 ${} 和 $() 有什么区别
- 二进制在互联网业务开发中的精妙应用
- 前微软设计师吐槽Windows 11开始菜单广告太丑:文本错误 背景老式
- 如何在 Linux 上使用 Bash 自动化任务
- Docker 是怎么实现的?前端怎么用 Docker 做部署?
- CentOS 停服!我们有哪些顶流的国产操作系统
- Containerd ctr、crictl、nerdctl 客户端命令介绍与实战操作
- Kubernetes 网络排错骨灰级中文指南
- 如何列出连接到 Linux 系统的 USB 设备