如果是在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=7
and 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)邀请你们进群喔。
👇👇👇
关注公众号,测试干货及时送达
如果想查看博主的所有文章列表,可以在公众号的菜单那里进行点击查看: