NoSQLBooster for MongoDB 中跨库关联查询
使用 MongoDB 是我们常常会遇到一些特殊的需求需要跨库关联查询,比如订单明细缺商品重量需要补商品重量,而商品重量数据又在商品库中,这事就需要跨库关联操作,示例代码如下:
// 使用 order 库,注意语句后面不要加分号
use ordervar count = 0;
db.order_detail.find({"store_code":"110"}).forEach(function(_order){// 在 goods 库查询 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("更新条数:" + count);
注意:跨库查询时必须使用 admin 库来授权连接操作。
上面示例的代码,数量不多时还能勉强凑合着使用。当数据量达到上万条数据时就显示非常非常慢。因为更新一条数据需要单条 findOne 再单条 update。因此得优化,将单条查询改批量查询(缓存查询结果),示例代码如下:
use ordervar count = 0;
var items = {};
db.getSiblingDB("goods").item.find({"store_code":"110"}).forEach(function(_item){// items 当做 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("更新条数:" + count);
经过将单条查询改成批量查询后执行效率确实提升不少,但是还是觉得慢,还得继续优化,将单条更新改成批量更新,示例代码如下:
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 无序操作db.order_detail.bulkWrite(ops, {ordered:false});ops = [];print("更新条数:" + count);}
});if(ops.length > 0){db.order_detail.bulkWrite(ops, {ordered:false});
}
print("更新完成,更新总条数:" + count);
批量操作参见: http://www.xuexiyuan.cn/article/detail/173.html
原文地址:https://xuexiyuan.cn/article/detail/204.html
NoSQLBooster for MongoDB 中跨库关联查询相关推荐
- 多案分库分表带来的问题-跨库关联查询
比如查询在合同信息的时候要关联客户数据,由于是合同数据和客户数据是在不同的数据库,那么我们肯定不能直接使用join 的这种方式去做关联查询. 我们有几种主要的解决方案: 1.字段冗余 比如我们查询合同 ...
- java mongodb 多表关联查询,多条件查询,分页,排序
前言: 由于最近项目赶,版本迭代快,不知道大BOSS从哪里听别人说MongoDB用来做关系型数据库好,而且速度快,性能高:听到这话的我,立马就反驳了回去:"MongoDB不支持事物" ...
- mysql跨实际视图_MySQL 跨库关联查询 (创建视图)
MySQL 跨库关联查询 (创建视图) 一, 前言 SQL CREATE VIEW 语句 什么是视图? 在 SQL 中, 视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列, 就像一个真实 ...
- Delphi中多库关联查询
在我们对数据库进行操作时,经常用到TTable控件,但TTable只能同时对一个数据表进行操作,而TQuery控件不仅具有TTable的多数功能,而且同时可对多个数据表进行操作.不仅如此,TQuery ...
- springboot集成mongoDB高级聚合查询,关联查询,lookup.let多条件关联查询。
目录 mongoDB的常用操作符 mongoDB的聚合管道符号 比较操作符 逻辑运算符 注意坑 数学运算符 mongoDB案例 插入测试数据 mongodb的阶段操作符号 $match: $count ...
- 使用MongoDB关联查询
使用MongoDB关联查询 使用MongoDB关联查询 Mongo shell 关联查询 $lookup 简单教程 $lookup 示例 使用$lookup执行单个相等连接 使用$lookup与一个数 ...
- 如何解决数据关联查询
如何解决数据关联查询 在传统数据库查询时,如果要获取的字段在别的库表中,通常会使用join操作获得,但是当数据量越来越大时,join操作会使查询速度越来越慢,这显然是不可取的,那么我们该如何进行查询呢 ...
- mysql跨库查询 索引_MySQL中跨库查询怎么搞?
导读 在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询;另一种是不同服务的跨库查询;它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 在MySQL中跨库查询主要分为两种情况,一种 ...
- MongoDB中的聚合管道($lookup多表关联查询、$unwind、$match、$project)
MongoDB中的聚合管道($lookup多表关联查询.$unwind.$match.$project) 管道的概念 聚合框架 $lookup的功能及语法 主要功能 基本语法 例子 说明 $unwin ...
最新文章
- Flume TailDir 基本流程
- No module named 'torch._C'
- linux 设置网络
- mysql分表规则(转)
- memkind版本查看_不同价位值得买轻薄本推荐~2020国庆篇
- MySQL为什么用 B+ 树,不用 B 树?
- jsp内置对象作业3-application用户注册
- 【JavsScript】作用域链
- caffe 使用自带的_net.py绘制网络图问题
- OpenCV-Python教程(5、初级滤波内容)
- wmv怎么转换成视频mp4,详细步骤
- STM32F207 HOST读写u盘枚举失败 USBH_BUSY 或 操作U盘 打开其根目录f_opendir一直卡死
- 马云:我是信念坚定的人
- Linux之磁盘与文件系统管理
- Unity屏幕永远保持为固定分辨率
- 単語境界/非単語境界(¥b, ¥B)
- Python——文件操作(day11)
- 2017年内大892数据结构部分参考答案
- 全志V3S零基础教程
- HTML5代码学习:值得收藏的HTML5代码段
热门文章
- linux c统计进程网络读写,linux网络分析、性能分析、文本格式化、文件读写操作之利器(mtr、top、jq、sponge)...
- down.php无法打开,php下载文件 图片不能打开,该怎么解决
- java 短路判断_java中和的区别(|和|同理)
- 孙叫兽进阶之路之如何进行情绪管理
- java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)
- 7 centos 查看程序文件数量_解析CentOS 7中系统文件与目录管理
- jquery常用表单操作
- JQ实现情人节表白程序
- 12个便于web设计及开发的在线工具
- 从零打造在线版H5页面生成器