NoSQLBooster for MongoDB 中跨库关联查询

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 使用 MongoDB 是我们常常会遇到一些特殊的需求需要跨库关联查询,比如订单明细缺商品重量需要补商品重量,而商品重量数据又在商品库中,这事就需要跨库关联操作,示例代码如下:// 使用 order 库,注意语句后面不要加分号use ordervar count = ;db.order_detail.find({"store_code":"110"}).forEach(function(_order){ var item = db.getSiblingDB("goods").item.findOne({"barcode":_order.barcode}); if(it

使用 MongoDB 是我们常常会遇到一些特殊的需求需要跨库关联查询,比如订单明细缺商品重量需要补商品重量,而商品重量数据又在商品库中,这事就需要跨库关联操作,示例代码如下:

// 使用 order 库,注意语句后面不要加分号
use order

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);

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
8月前
|
JSON NoSQL MongoDB
mongodb基本操作,增删改查,查询,索引,权限机制
mongodb基本操作,增删改查,查询,索引,权限机制
|
8月前
|
SQL NoSQL 关系型数据库
MongoDB复杂分组聚合查询1
MongoDB复杂分组聚合查询1
429 0
|
7月前
|
NoSQL MongoDB 索引
开心档-软件开发入门之MongoDB 覆盖索引查询
开心档-软件开发入门之MongoDB 覆盖索引查询
49 0
|
8天前
|
NoSQL 关系型数据库 MySQL
深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
在 MongoDB 中,我们使用 find() 和 find_one() 方法来在集合中查找数据,就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样
69 1
|
1天前
|
NoSQL MongoDB 数据库
通过优化索引以消除 MongoDB 中的 "查询目标已超过1000个扫描对象/返回的文档数" 警告
MongoDB NoSQL数据库在处理复杂查询时可能出现“查询目标已超过1000个扫描对象/返回的文档数”警告。文章分析了该问题,展示了一个示例集合和相关索引,并提供了查询示例。通过`explain`命令发现查询未有效利用索引。解决方案是遵循ESR规则,创建新索引从而优化查询并消除警告。
22 1
|
8天前
|
NoSQL 测试技术 定位技术
【MongoDB 专栏】MongoDB 的地理空间索引与位置查询
【5月更文挑战第10天】MongoDB 支持地理空间数据处理,提供2dsphere(球面)和2d(平面)索引,适用于地图导航、物流、社交网络等领域。通过创建索引,可加速位置查询,如查询范围、最近邻及地理空间聚合。案例包括地图应用、物流追踪和社交网络。注意数据准确性、索引优化和性能测试,以发挥其在地理空间处理中的潜力。学习此功能,为应用开发解锁更多可能性!
【MongoDB 专栏】MongoDB 的地理空间索引与位置查询
|
8天前
|
NoSQL 数据处理 MongoDB
MongoDB查询操作深度剖析
【4月更文挑战第30天】本文深入探讨了MongoDB查询操作,包括查询语法、优化及高级技巧。使用`find()`方法进行查询,如`db.users.find({ age: { $gt: 25 } })`找年龄大于25的用户。优化查询性能涉及创建索引、使用复合索引和避免全表扫描。高级查询涵盖聚合管道、文本搜索和地理空间查询,提供复杂数据处理和地理位置查询能力。理解并应用这些知识能提升MongoDB的使用效率和应用性能。
|
8天前
|
JSON NoSQL MongoDB
mongodb导出聚合查询的数据
mongodb导出聚合查询的数据
|
8天前
|
NoSQL MongoDB
mongodb分组查询
mongodb分组查询
|
8天前
|
NoSQL MongoDB
使用MongoTemplate 对 mongodb数据进行分组、排序、分页、连表查询
使用MongoTemplate 对 mongodb数据进行分组、排序、分页、连表查询