​ 使用 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 中跨库关联查询相关推荐

  1. 多案分库分表带来的问题-跨库关联查询

    比如查询在合同信息的时候要关联客户数据,由于是合同数据和客户数据是在不同的数据库,那么我们肯定不能直接使用join 的这种方式去做关联查询. 我们有几种主要的解决方案: 1.字段冗余 比如我们查询合同 ...

  2. java mongodb 多表关联查询,多条件查询,分页,排序

    前言: 由于最近项目赶,版本迭代快,不知道大BOSS从哪里听别人说MongoDB用来做关系型数据库好,而且速度快,性能高:听到这话的我,立马就反驳了回去:"MongoDB不支持事物" ...

  3. mysql跨实际视图_MySQL 跨库关联查询 (创建视图)

    MySQL 跨库关联查询 (创建视图) 一, 前言 SQL CREATE VIEW 语句 什么是视图? 在 SQL 中, 视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列, 就像一个真实 ...

  4. Delphi中多库关联查询

    在我们对数据库进行操作时,经常用到TTable控件,但TTable只能同时对一个数据表进行操作,而TQuery控件不仅具有TTable的多数功能,而且同时可对多个数据表进行操作.不仅如此,TQuery ...

  5. springboot集成mongoDB高级聚合查询,关联查询,lookup.let多条件关联查询。

    目录 mongoDB的常用操作符 mongoDB的聚合管道符号 比较操作符 逻辑运算符 注意坑 数学运算符 mongoDB案例 插入测试数据 mongodb的阶段操作符号 $match: $count ...

  6. 使用MongoDB关联查询

    使用MongoDB关联查询 使用MongoDB关联查询 Mongo shell 关联查询 $lookup 简单教程 $lookup 示例 使用$lookup执行单个相等连接 使用$lookup与一个数 ...

  7. 如何解决数据关联查询

    如何解决数据关联查询 在传统数据库查询时,如果要获取的字段在别的库表中,通常会使用join操作获得,但是当数据量越来越大时,join操作会使查询速度越来越慢,这显然是不可取的,那么我们该如何进行查询呢 ...

  8. mysql跨库查询 索引_MySQL中跨库查询怎么搞?

    导读 在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询;另一种是不同服务的跨库查询;它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 在MySQL中跨库查询主要分为两种情况,一种 ...

  9. MongoDB中的聚合管道($lookup多表关联查询、$unwind、$match、$project)

    MongoDB中的聚合管道($lookup多表关联查询.$unwind.$match.$project) 管道的概念 聚合框架 $lookup的功能及语法 主要功能 基本语法 例子 说明 $unwin ...

最新文章

  1. Flume TailDir 基本流程
  2. No module named 'torch._C'
  3. linux 设置网络
  4. mysql分表规则(转)
  5. memkind版本查看_不同价位值得买轻薄本推荐~2020国庆篇
  6. MySQL为什么用 B+ 树,不用 B 树?
  7. jsp内置对象作业3-application用户注册
  8. 【JavsScript】作用域链
  9. caffe 使用自带的_net.py绘制网络图问题
  10. OpenCV-Python教程(5、初级滤波内容)
  11. wmv怎么转换成视频mp4,详细步骤
  12. STM32F207 HOST读写u盘枚举失败 USBH_BUSY 或 操作U盘 打开其根目录f_opendir一直卡死
  13. 马云:我是信念坚定的人
  14. Linux之磁盘与文件系统管理
  15. Unity屏幕永远保持为固定分辨率
  16. 単語境界/非単語境界(¥b, ¥B)
  17. Python——文件操作(day11)
  18. 2017年内大892数据结构部分参考答案
  19. 全志V3S零基础教程
  20. HTML5代码学习:值得收藏的HTML5代码段

热门文章

  1. linux c统计进程网络读写,linux网络分析、性能分析、文本格式化、文件读写操作之利器(mtr、top、jq、sponge)...
  2. down.php无法打开,php下载文件 图片不能打开,该怎么解决
  3. java 短路判断_java中和的区别(|和|同理)
  4. 孙叫兽进阶之路之如何进行情绪管理
  5. java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)
  6. 7 centos 查看程序文件数量_解析CentOS 7中系统文件与目录管理
  7. jquery常用表单操作
  8. JQ实现情人节表白程序
  9. 12个便于web设计及开发的在线工具
  10. 从零打造在线版H5页面生成器