如果是在mysql里面,这个查起来就很方便,但是,在mongo里面的话,查询起来就没这么方便了。
如果使用付费版的Studio 3T工具的话,也可以像使用mysql一样查询mongo数据,但是免费版不支持sql的用法,只能用js语法的查询方式:
需求:
代码语言:javascript复制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来实现类似的效果。
代码语言:javascript复制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的结果是一个数组,
$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操作符选择需要的字段。