我有下一个数据:
表1
[
{
"_id" : ObjectId("5ef3611fc3e39a4891c479d9"),
"bid" : ObjectId("db08c671b5174f49886ca8de"),
},
{
"_id" : ObjectId("5ef30da4c3e39a4891c479d8"),
"bid" : ObjectId("db08c671b5174f49886ca8de"),
}
]
表2:
[
{
"_id" : ObjectId("5ef3626fc3e39a4891c479da"),
"t1_id" : ObjectId("5ef30da4c3e39a4891c479d8"),
"bid" : ObjectId("db08c671b5174f49886ca8de")
}
]
我有下一个SQL查询,其中有两个连接条件
SELECT table1.* FROM table1
LEFT JOIN table2 t2 ON(t2.bid=table1.bid AND t2.t1_id=table1._id)
并尝试使其适应mongoDB。 我来了下一个查询
db.getCollection("table1").aggregate(
[
{
"$project" : {
"_id" : NumberInt(0),
"leads" : "$$ROOT"
}
},
{
"$lookup" : {
"from" : "table2",
"as" : "t2",
"let" : {
"bid" : "$bid",
"t1_id" : "$t1_id"
},
"pipeline" : [
{
"$match" : {
"$expr" : {
"$and" : [
{ "$eq" : [ "$table1._id","$$t1_id"]},
{ "$eq" : [ "$table1.bid","$$bid"]}
]
}
}
}
]
}
},
{
"$unwind" : {
"path" : "$ps",
"preserveNullAndEmptyArrays" : true
}
}
],
);
我得到下一个结果
{
"table1" : {
"_id" : ObjectId("5ef30da4c3e39a4891c479d8"),
"bid" : ObjectId("db08c671b5174f49886ca8de"),
},
"t2" : [
{
"_id" : ObjectId("5ef3626fc3e39a4891c479da"),
"t1_id" : ObjectId("5ef30da4c3e39a4891c479d8"),
"bid" : ObjectId("db08c671b5174f49886ca8de")
}
]
},
{
"table1" : {
"_id" : ObjectId("5ef3611fc3e39a4891c479d9"),
"bid" : ObjectId("db08c671b5174f49886ca8de"),
},
"t2" : [
{
"_id" : ObjectId("5ef3626fc3e39a4891c479da"),
"t1_id" : ObjectId("5ef30da4c3e39a4891c479d8"),
"bid" : ObjectId("db08c671b5174f49886ca8de")
}
]
}
我不明白,为什么表1中的第二条记录与t2匹配,尽管t2.t1_id!= table1._id。
您能帮我找到导致这种结果的原因并解决mongo查询吗?
答案 0 :(得分:1)
let
的{{1}}参数从“本地”表(t1)中获取一个表达式,我假设$lookup
不存在
$t1_id
参数对应于查找的输出结果字段,而不是别名。
在管道中,以as
开头的表达式是在$$
参数中声明的变量。以let
开头的表达式是“外国”表(t2)中的表达式
因此,要直接从您的SQL语句转换$
管道阶段,应该是
$lookup