如何结合where子句和join? [复制]

Posted

技术标签:

【中文标题】如何结合where子句和join? [复制]【英文标题】:How to combine where clause and join? [duplicate] 【发布时间】:2017-01-17 13:49:27 【问题描述】:

如果我用 SQL 写这个,它会是(有点):

SELECT *
FROM request req, response res
WHERE req.suites_test=res.key    # join
  AND res.version='2.0.b1662.5'  # extra conditions
  AND req.suites_id='58762c40664df86d2069e2c9'

在 MongoDB 中我可以做到:

# a join between request and response 
db.response.aggregate([$lookup: from: "request", localField: "key", foreignField: "suites.test", as: "matching"  ])

# find all requests that match a condition
db.request.find(  "suites.id": ObjectId("58762c40664df86d2069e2c9")  )

# find all responses that match a condition
db.response.find(  "version": "2.0.b1662.5"  )

如何在一个 MongoDB 查询中组合这三者?

【问题讨论】:

第 1 步:开始编写现代的、显式的 JOIN 语法! 我是 MongoDB 新手,不知道现代显式 JOIN 语法是什么……在文档 docs.mongodb.com/manual/reference/operator/aggregation/lookup 中并没有说它已被弃用。 Aggregate 实际上是一个管道,在那里匹配你的文档。 对不起,我的意思是 SQL JOIN! 根据您的个人查询,您只需要在response$lookup 之前)和request $unwind 之后,$lookup 之后)包含$match 阶段) 聚合管道中的集合。 【参考方案1】:

有一堆相似的重复项,但我找不到完全匹配的重复项。所以,我根据 OP 的要求添加了一个答案。

根据您的个人查询,您只需在聚合管道中包含响应($lookup 之前)和请求($unwind 之后,$lookup 之后)集合的 $match 阶段。如下所示。

db.response.aggregate([
    $match: 
        "version": "2.0.b1662.5"
    
, 
    $lookup: 
        from: "request",
        localField: "key",
        foreignField: "suites.test",
        as: "matching"
    
, 
    $unwind: "$matching"
, 
    $match: 
        "matching.id": ObjectId("58762c40664df86d2069e2c9")
    
])

【讨论】:

因为找不到精确的重复我们称之为可能的重复 最后,您只是用这些可能的重复项污染了 SO,难怪我发现问题被标记为可能与我最初寻找的问题无关的其他问题的重复项,从而污染 SO 与乒乓可能重复。 明白,但我觉得可能的重复并不接近 OP 的问题,而是纯粹的个人观点。 现在任何人都在寻找一种简单的方法来混合 join 和 where 子句将在这个 Q/A 中找到它,而不是绝望地在 SO 中弹跳。

以上是关于如何结合where子句和join? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥以及何时在 WHERE 子句中带有条件的 LEFT JOIN 不等于在 ON 中的相同 LEFT JOIN? [复制]

MySQL结合where子句的join性能

如何在 mysqli 准备语句中使用多个内部连接和多个 WHERE 子句? [复制]

如何在 CodeIgniter 中使用 JOIN 和 get_where 子句

将索引与 where 和 join 子句一起使用

我们可以在 WHERE 子句中对同一列使用多个 AND 条件吗? [复制]