MongoDb4.2如何实现Inner join 或 where exists(子查询)效果

Mint_Grass 2019-10-09 07:34:12
SQL版本:

select a.id, a.name, a.xxx
from A a
where exists (select 1 from B b where b.flag=0 and b.pid = a.id)
and a.name like '%xx%'



两个集合,分别都是百万,甚至千万数据;请问MongoDB中如何实现以上需求?

看网上说mongodb都是扁平设计,不适合做这种关联查询;那这种需求又是如何实现的呢?

例如:A是用户表,B是订单表
想要查询在【10月1日至10月3日,购买了移动硬盘的用户】(订单表),且【用户属地在北京】(用户表),最终返回的结果,只要 用户表的字段


Oracle中已分区、建立索引,但查询效率还是很低。
...全文
676 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang2xiao 2019-10-21
  • 打赏
  • 举报
回复
新建地区索引,索引的id包含能区别地区的特征字符
检索时
1 扫描索引获得实际数据的id,
2 用得到的id去取数据
zjcxc 2019-10-11
  • 打赏
  • 举报
回复
db.a.insertMany([ {id:1, name:'xx1'}, {id:2, name:'xx2'}, {id:3, name:'aa1'}, {id:4, name:'aa2'} ])
db.b.insertMany([ {id:1, pid:1, flag:0}, {id:2, pid:2, flag:1}, {id:3, pid:3, flag:0}, {id:4, pid:4, flag:1} ])
db.a.aggregate([
{$match:{ name:/xx/ }},
{$lookup:{
from:'b', as:'b_doc',
let:{ id:'$id' },
pipeline:[
{$match:{ flag:0, $expr:{$eq:['$pid', '$$id']} }}
]
}},
{$match:{ 'b_doc._id':{$exists:true} }},
{$project:{ _id:0, b_doc:0 }}
])
Mint_Grass 2019-10-10
  • 打赏
  • 举报
回复
使用嵌套文档的方式,不知道效率如何。


db.test1.aggregate([
{$match: {"users.account":"user5"} },
{$project: {id:1, name:1}}
])
zjcxc 2019-10-10
  • 打赏
  • 举报
回复
mongodb 不适合做关系查询
zjcxc 2019-10-10
  • 打赏
  • 举报
回复
关系数据建议还是存储到关系型数据库
在关系数据库中,这个查询性能差主要在于你的 LIKE 吧,如果不是 LIKE 查询,这种需求是很快的

1,746

社区成员

发帖
与我相关
我的任务
社区描述
MongoDB相关内容讨论区
社区管理员
  • MongoDB社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧