MongoDB在多个条件下匹配管道

时间:2020-06-24 18:01:22

标签: mongodb mongodb-query aggregation-framework

我有下一个数据:

表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查询吗?

1 个答案:

答案 0 :(得分:1)

let的{​​{1}}参数从“本地”表(t1)中获取一个表达式,我假设$lookup不存在

$t1_id参数对应于查找的输出结果字段,而不是别名。

在管道中,以as开头的表达式是在$$参数中声明的变量。以let开头的表达式是“外国”表(t2)中的表达式

因此,要直接从您的SQL语句转换$管道阶段,应该是

$lookup