NoSQLBooster for MongoDB 中跨库关联查询

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 使用 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);

目录
相关文章
|
7月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
109 0
|
12月前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
9月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
316 17
|
10月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
386 9
|
NoSQL 定位技术 MongoDB
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
解锁MongoDB索引的秘密:优化查询效率与应对限制的策略
247 0
|
12月前
|
存储 NoSQL MongoDB
MongoDB 查询分析
10月更文挑战第21天
103 1
|
12月前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
115 1
|
12月前
|
SQL NoSQL MongoDB
MongoDB 查询文档
10月更文挑战第15天
342 1
|
12月前
|
人工智能 NoSQL 机器人
MongoDB Atlas与YoMio.AI近乎完美适配:推理更快速、查询更灵活、场景更丰富
随着MongoDB的新发布和革新,YoMio.AI的“闪电式发展”值得期待。
|
12月前
|
NoSQL MongoDB 数据库
MongoDB 删除数据库
10月更文挑战第13天
247 0

推荐镜像

更多
下一篇
oss教程