如果是在mysql里面,这个查起来就很方便,但是,在mongo里面的话,查询起来就没这么方便了。
如果使用付费版的Studio 3T工具的话,也可以像使用mysql一样查询mongo数据,但是免费版不支持sql的用法,只能用js语法的查询方式:
需求:
select * from equity t1 left join equity_ext t2 on t1.quoteId =t2.quoteId and t1.regionId = 6 and t1.listedStatus=1 and t1.securityType=7and t2.isPTP != 0
转换为js语法查询:
在MongoDB中,要实现类似SQL中的LEFT JOIN操作,通常需要使用聚合框架中的$lookup操作符。这个操作符允许你在一个集合中查找匹配的文档,并将其结果添加到原始文档中。在MongoDB中,没有直接的LEFT JOIN语法,但是可以通过$lookup来实现类似的效果。
db.equity.aggregate([{$lookup: {from: "equity_ext", // 指定要连接的集合localField: "quoteId", // 指定当前集合中用于匹配的字段foreignField: "quoteId", // 指定要连接的集合中的字段as: "ext" // 指定连接结果的字段名}},{$unwind: "$ext" // 展开连接结果,使其成为单独的文档},{$match: {regionId: 6,listedStatus: 1,securityType: 7,"ext.isPTP": { $ne: 0 } // 非0值,即不等于0}}
]);
$lookup
阶段:执行左连接,将equity
集合(别名为t1
)和equity_ext
集合(别名为t2
)进行连接,基于quoteId
字段。$unwind
阶段:由于$lookup
的结果是一个数组,$unwind
用于将这个数组展开为多个文档,每个文档包含一个来自equity_ext
集合的匹配项。$match
阶段:过滤结果,只保留满足特定条件的文档,即regionId
为6,listedStatus
为1,securityType
为7,并且equity_ext
集合中的isPTP
字段不等于0。
db.equity.aggregate([{$match: {regionId: 6,listedStatus: 1,securityType: 7}},{$lookup: {from: "equity_ext",localField: "quoteId",foreignField: "quoteId",as: "equity_ext_docs"}},{$unwind: {path: "$equity_ext_docs",preserveNullAndEmptyArrays: true}},{$match: {"equity_ext_docs.isPTP": { $ne: 0 }}},{$project: {_id: 1,quoteId: 1,regionId: 1,listedStatus: 1,securityType: 1,equity_ext_docs: {quoteId: 1,isPTP: 1}}}
]);
这个查询首先从equity
集合中筛选出满足条件的文档(regionId
为6,listedStatus
为1,securityType
为7),然后使用$lookup
操作符与equity_ext
集合进行左连接。接下来,使用$unwind
操作符展开连接后的数组,并使用$match
操作符筛选出isPTP
不等于0的文档。最后,使用$project
操作符选择需要的字段。
End
如果觉得文章对你有帮助的话,欢迎点赞转发~
如果还没有进粉丝交流群的小伙伴,赶快添加好友(xiaobotester)邀请你们进群喔。
👇👇👇
关注公众号,测试干货及时送达
如果想查看博主的所有文章列表,可以在公众号的菜单那里进行点击查看: